当前位置:首页 > 生活 > 正文

如何更好地generalize一个模型?掌握这几点让效果更稳定!

如何更好地generalize一个模型?掌握这几点让效果更稳定!

如何更好地generalize一个模型?掌握这几点让效果更稳定! 搞机器学习,最头疼的不是怎么把模型跑起来,而是怎么让它在没见过的数据上也能跑得也就是泛化能力。我这几年...

如何更好地generalize一个模型?掌握这几点让效果更稳定!

搞机器学习,最头疼的不是怎么把模型跑起来,而是怎么让它在没见过的数据上也能跑得也就是泛化能力。我这几年踩的坑,基本都跟这玩意儿脱不开关系。

一开始我总是盯着训练集,恨不得把准确率刷到99.99%。结果一跑测试集,好家伙,直接跌到70%多,那感觉就像坐过山车,刺激是真刺激,但心脏受不了。

数据处理是基础

我发现,大部分泛化问题都出在数据上。你要是拿一堆质量参差不齐的数据去喂模型,它学到的肯定也是一堆乱七八糟的东西。

如何更好地generalize一个模型?掌握这几点让效果更稳定!
  • 数据清洗得狠点: 刚开始我图省事,对那些异常值、噪音直接忽略过去。后来发现,那些“脏数据”对模型的影响太大了。我开始花大力气去识别那些明显不对劲的样本,比如本来该是正数的结果成了负数,或者数值大得离谱的。删掉一些或者修正一下,模型一下子就稳了不少。
  • 数据增强要科学: 尤其在图像处理上,我以前只会随便加点旋转、翻转。后来我琢磨了一下,不同业务场景下,数据增强的侧重点不一样。比如做自动驾驶的,光照变化、遮挡情况都要考虑到。我开始引入更多贴近真实世界复杂情况的增强手段,而不是机械地做那些几何变换。

模型复杂度得掂量

很多人有个误区,觉得模型越深越复杂,效果就越我以前就是这么干的,堆各种复杂的网络结构,结果就是过拟合的大本营。

后来我学会了“克制”。

  • 别过度拟合: 模型参数太多,数据不够多的时候,模型就会把训练集里的特定噪音都当成规律去记住了。我开始用更简单的模型去跑,如果简单模型效果还行,就尽量不用复杂的。
  • 正则化玩明白了: L1、L2正则化我用得很频繁。尤其是在全连接层上加点权重衰减,能有效防止权重变得太大。dropout是我的老朋友了,特别是放在深度网络里,每次训练都随机“丢掉”一些神经元,强迫网络学习更鲁棒的特征,效果立竿见影。

训练过程得精细

光把数据和模型搭起来还不行,训练过程中的一些小细节,决定了模型是天上还是地下。

我以前都是随便设个学习率,跑完为止。现在我严格控制学习率的衰减策略。

如何更好地generalize一个模型?掌握这几点让效果更稳定!
  • 学习率调度: 刚开始学习率可以高点,让模型快速找到大致方向,后面一定要慢慢降下来,让它在最优解附近精细地微调。我一般采用余弦退火或者分段递减的方式,效果比恒定学习率好太多了。
  • 早停机制: 这是避免过拟合的杀手锏。我设置一个监控指标,比如验证集的Loss,如果连续好几轮都没下降,立马停掉训练。这样既省时间,又保证了模型不会在过拟合的路上越走越远。

现在我再看一个模型好不好用,第一反应不是看训练精度,而是看训练集和验证集曲线的差距,如果差距不大,那这个模型泛化性才算说得过去。这几点坚持下来,我跑出来的模型稳定性确实高多了,不容易被新数据“吓到”。

最新文章