查看原文
其他

心法利器[80] | 稳定性和过拟合问题真的重要吗序

机智的叉烧 CS的陋室 2024-04-24

心法利器


本栏目主要和大家一起讨论近期自己学习的心得和体会,与大家一起成长。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有

2022年新一版的文章合集已经发布,累计已经60w字了,获取方式看这里:CS的陋室60w字原创算法经验分享-2022版


往期回顾

最近在做效果调优的时候,使用了一些比赛常用的trick,结果得到的是和实际大家的口碑有些不接近,于是引申出了一些新的经验。

懒人目录:

  • 方案的原理和思路。
  • 稳定性是否真的重要?
  • 过拟合问题是否必要解决
  • 比赛/论文场景和实际落地场景的差距

背景

事情的背景是这样的,在效果调优过程,出于下面两个原因,想试试比赛中比较常用的提分trick:

  • 看指标能不能进一步提升一些。
  • 预测过程中发现,存在一些case,会因为不同的训练而左右横跳。

正好时间比较松,所以我就动手尝试Batch Normalization、R-dropout、正则化、对抗训练之类比较常见的方案,结果挺让人感到意外的,虽说之前我是已经做过很多实验了,虽然效果就是这些方案我都试过,偶尔有些是有效的,大部分情况可能就是小幅度波动(可能就是误差了),但是,这次无疑例外的都下降了,让我多少有些惊讶的,而且下降幅度其实挺大的。

让我们来分析分析失效的原因吧。

方案的原理和思路

要了解失效的原因,一个重要的方法就是要回归方案本源,了解方案所擅长解决的问题,很多时候反效果就是因为药没对症。

  • Batch Normalization,其实就是在batch内对数据做正则化,即减均值除以方差,解决的是没有使用权量数据而产生的数据波动问题,从而提升收敛速度,降低梯度消失或者爆炸发生的概率,简而言之,就是避免因为抽样、分batch导致训练过程出现过多的迭代波动。
  • 正则化就是通过减少不必要的参数,或者是让参数之间的重要性更加趋于平衡,从而达到提升泛化能力的目标。
  • R-dropout和对抗训练,本质都是给模型一些扰动,而让模型产生能够抵抗这些波动的能力,模型的稳定性的提升。

从这里可以看到,这几个方法里,不外乎就是想优化两个点,过拟合和稳定性。

  • 过拟合,过于紧密地匹配特定数据集所导致的无法拟合更广泛的数据,泛化能力下降。
  • 稳定性,模型抵抗异常数据扰动的能力,尤其是训练阶段的训练数据。

说白了,其实这两个问题是有些相似性的,都是对抗异常数据的能力,只不过这个异常的来源不同,一个针对未来,即训练集之外的,要求预测阶段的结果稳定,另一个是针对当下的,即训练集之内的,要求相同的训练集尽可能训练处类似结果的能力。

但是,灵魂拷问来了,我们真的需要这种稳定性和处理过拟合的能力吗?

稳定性是否必要

对于稳定性,即模型对抗训练数据中异常数据的能力,本质其实是让模型在多次实验过程,能够得到更加稳定的效果,这点其实在多次训练的试验来看,确实预测的准确性上,波动不会很大,会趋于一个稳定值。

然而,在现实的应用下,我们需要的其实是一次比较突出的效果,我们希望能够去赌模型的上限,有那么一次训练或者random-seed,这次训练训练出来的模型效果在测试集或者验证集里面最高,这个就直接拿来用了,其实可以理解为游戏里的一次“暴击”,而所谓的训练稳定性,其实在拉低这个打出暴击的概率,而倾向于去打出更稳定的准确率,这个从平台层面给业务方使用,或者是类似预训练模型的训练,可能是一个比较好的特性,然而反复到具体的一个业务,如果希望进一步优化,我们在成本允许的情况下,无疑会希望更快打出这个“暴击”,此时的稳定性就是一个劣势。

另一方面,我们在追求稳定性的过程中,是有代价的。在r-dropout里,损失函数需要考虑两次预测的KL散度,对抗学习里,则是会往增大损失的方向增加扰动,这无疑会影响我们损失函数中最核心的要求精度的部分,概率论上其实就会把这个认为是“有偏估计”了,这无疑会一定程度拉低了模型的上限,相当于,这个稳定性,其实是牺牲了模型的上限而带来的。当然也会有人说,这里的r-dopout损失之类的在损失函数里加组件的方案在训练后期对主损失函数的影响很大,但因为在训练初期已经影响了其早期的迭代多样性了,所以影响仍旧不可抹去,这里需要讨论的,其实就是个权衡问题了吧。

而另一个角度,不稳定,不代表这个模型波动是本着好的方向波动,他也是可能本着坏的方向去波动的,此时,如果使用提升稳定性的方案,确实是会给综合的平均效果带来提升。

现在回过头来看,类似r-dropout、batch-norm、对抗学习这类对稳定性有提升的方案,会出现比较明显的不错和没什么效果的明显分歧的原因了。

过拟合问题是否必要解决

首先,我们思考一个问题,过拟合是否可以量化,是否可以解决,或者是否有必要解决。

我来举个例子。

  • 方案A,训练集acc是85%,测试集是72%,
  • 方案B,训练集acc是99%,测试集是80%。

从训练集和测试集的差距来看,方案B的过拟合程度很高,但是实际应用下,我们会更倾向于选择方案B,原因很简单,他的指标高。大家发现问题没,我们似乎不那么关注过拟合了,我们关注的是测试集的指标尽可能高了,我们可能在考虑过拟合的问题之后,减弱了这个问题,但是最终指标会下降,我们依旧不会选。

所以我想纠正大家对过拟合的认知:

  • 过拟合本身不算是问题,他不需要“被解决”。

那问题又来了,为什么在有些情况,我们通过正则化,降低了过拟合程度,能够带来效果的提升?我自己是倾向于这么解释的,由于训练集过于集中或者数据不足的原因,模型可能会在训练过程中,过度关注某些信息了,而这些信息其实是无效甚至是错误信息,因此,我们需要用正则化来弱化这种重要性,这个方式可以是随机失活,可以是L2正则(追求平均)或者L1(追求尽可能少)等,此时,在测试集上,就体现为效果的提升了,不过度关注某几个信息,而关注更多信息,泛化能力自然就提升了,典型的例子例如多元线性回归里存在多重共线性的话,用正则化可以轻松解决,这就是lasso或者岭回归会被提出的出发点。

那为什么有的时候会失效,除了和前面稳定性问题讨论的“有偏估计”的问题之外,还有一个原因就是,我们去弱化的信息,我们无法验证是不是真的“无效”的,例如L1正则,他就是要约束参数的数量,信息的削弱势必会影响最终模型的判断。

比赛/论文场景和实际落地场景的差距

一般的比赛和论文,往往pk的是模型的稳定性,无论是训练的,还是针对最终的预测的,因为比赛里的B榜未知,为了通过A榜推断预测结果,提升稳定性无疑这种模式更加吃香,而对于论文,现在很多的实验大都也是通过“多次实验取均值”的方式来进行,而且还有同行给的压力,要求模型的“可复现性”,此时稳定性更高的方案就会被保留下来,成为了经典。

然而,在实际应用过程汇总,我们追求的是能得到一个针对测试集、在线指标更稳定的一个模型,我们甚至可以为此实验好几次,那么,相比于稳定,我们更希望能个模型能在一定概率下打个“暴击”,然后这个模型就可以被用起来了。

选型思路

当然,这里不是说就让大家在落地时,不用这些方案,相反,我是希望大家去尝试。

我只是说稳定性和过拟合不那么重要,但是我们仍旧是希望模型能有更好的指标和效果的,对于那些喜欢往下波动的情况,提升稳定性了那指标不就往上走了,对过拟合的方案,缓解过拟合后考虑提升训练集的效果那测试集不也会跟着走了。

只是,我们细想:

  • 首先,工作中更多要求的是稳定提升,实验可以有但是不见得那么多次,而这些方案似乎不稳定。
  • 不稳定就算了,可能提升量不大,毕竟稳定性提升只是让模型指标趋向平衡,就是折中,过拟合问题本身和指标也不正相关。

其实并不适合花费很多精力来做,他们更像锦上添花的尝试。有这精力,优先考虑数据增强、挖掘错误样本、调整特征之类的方式,然后是模型的升级迭代,最后才是考虑这些方案承担收官任务,可能更为可靠。

后记

过拟合这个问题,其实早就想聊的,但是一直没有很好的切入点和完整的解释,这次借助自己的实验和理解也算搞定了,联合这个稳定性问题,感觉写的还是比较深入的,但是不失可理解性,希望大家有所收获吧。

深圳疫情已经到了增量高峰期,最近因为很多原因变成了两周一更,后面应该会恢复周更。希望大家能成功抗疫,还没阳的能坚持下去,已经阳了的早日康复吧,加油。

继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存