过拟合以及如何防止过拟合

什么是过拟合

过拟合即模型在训练过程中对模型参数进行拟合的过程中,由于训练数据集存在抽样误差(噪声),复杂的模型在训练的过程中会将抽样误差也一同进行拟合。这就导致训练好的模型在训练集上的表现很好,在测试集上的表现很差的原因。
导致过拟合的主要原因有两个:数据量太少和模型过于复杂
因为机器学习算法在拟合出正确的规则后,具有进一步拟合噪声的能力,因此,模型在训练的过程中极有可能会发生过拟合。过拟合会大大降低模型的鲁棒性,因此在实际应用的过程中我们要尽可能的防止模型发生过拟合现象。

如何防止过拟合

关于如何防止过拟合先放一张图
过拟合以及如何防止过拟合
防止过拟合可以从数据和模型这两个角度进行琢磨。

增加数据量

马云曾经说过(被说过):数据是二十一世纪的石油。不管这个命题是否为真,我们都能意识到数据对当今社会的重要性。的确,增加数据也是解决过拟合问题最为有效的手段。数据量越大,抽样误差就越小,模型拟合的误差就越小,模型的泛化性能就越好。

简化模型

如果我们已经有了足够多的训练数据,但是我们训练的模型还是会发生过拟合的话,那就有可能是我们的模型过于复杂了,导致模型对一些数据中的一些噪声都进行了和好的拟合。模型只是对部分数据产生过拟合,我们可以在保证模型能够正确的拟合出数据中的规则的同时,又能适当的降低模型的复杂度,减少模型对抽样误差的拟合程度。适当的降低模型的复杂度,不仅能很好降低模型的过拟合程度,同时也能提高模型的训练速度以及运行速度。
降低模型的复杂度可以提前结束模型的训练过程(early stopping)。通常情况下,模型在训练的过程中会优先拟合数据的正确的规则,拟合出正确的规则之后,才会拟合数据中的误差。所以在训练的过程中就存在一个转折点,在这个转折点之前,模型一致都处于欠拟合状态,在这个转折点之后,模型就开始过拟合。所以在训练的过程中我们可以通过迭代不同的训练周期,从而观察这个转折点的位置,然后在这个转折点结束训练,这样也可以很好的防止模型发生过拟合。
对于线性模型如LR而言,可以在损失函数中引入正则化项来降低模型的复杂度,从而有效的防止模型发生过拟合现象。正则化项分为L1正则(L1范数)和L2正则(L2范数)。
优化目标:
过拟合以及如何防止过拟合
引入L1正则项:
过拟合以及如何防止过拟合
引入L2正则项
过拟合以及如何防止过拟合
加入正则化的目的就是为了使得模型在训练的时候,既要降低模型的训练误差,又要使得参数的范数尽可能的小,也就是降低模型的复杂度。关于引入L1正则化项和L2正则化项为什么能够防止模型发生过拟合可以参照这两篇知乎回答:
https://zhuanlan.zhihu.com/p/35356992
https://www.zhihu.com/question/20924039/answer/131421690
对于深度学习模型而言,可以在模型中引入dropout层防止模型发生过拟合,提高模型的泛化性能。
所谓dropout, 就是在模型的训练过程中,在模型的前向传输过程中,当传输至dropout层时,会随机的删除一定比例(dropout中的参数)的隐藏神经元,输入和输出神经元保持不变,如下图所示:
过拟合以及如何防止过拟合
然后再根据训练误差利用反向传播算法更新网格中未隐藏的神经元参数的大小。更新完为隐藏的参数后,再恢复之前被隐藏的神经元。这就导致训练一次后,只更新未被隐藏神经元参数,被隐藏的神经元的参数则保持不变。
继续重复上述套路,随机更新模型中的参数。
至于dropout为什么能有效的防止模型发生过拟合,其一是是因为引入dropout层进行训练后,相当于训练了了多个模型,最后训练的结果也就相当于取多个模型的平均值,类似于bagging;其二是dropoout通过随机更新参数,减少了不同特征之间的宫适应性,从而能有效提高模型的泛化性能。
这是对近期复习过拟合以及如何防止过拟合做的一个简单的学习总结。其中难免会有一些错误,希望各位大佬批评指正。