提升深度学习模型泛化性的方法

一个好的深度学习模型的目标是将训练数据很好地推广到问题领域的任何数据。这使我们可以对模型从未见过的数据进行将来的预测。
首先,当模型泛化性差的时候,我们需要找到其原因,当训练集能够很好地拟合,但是测试集却不能有很好的准确率,主要可能有以下几点原因:

网络足够大,仅仅记住了所有样本

当网络足够大时,无论你的数据集多么没规律,多么无意义,网络都能记住它们。
如果你的数据集巨大,但是模型仅在训练集上表现良好,泛化性一般,同时提升模型大小时泛化性没有提升,那么就要考虑是这样情况了
所以,我们需要做的是:
1.找当前任务的公开数据集在自己的模型上训练,对比一些性能优越算法的性能,这样能让我们验证自己算法的可行性,以测试所有基础架构是否正确到位。
2.保证数据集和标签正确无误,这个很好理解,当数据集有错误的时候,网络无论如何无法学到真正的规律;
3.正则化
4.超参探索、尝试

过拟合

如果是过拟合的话,可以考虑:
增大数据集:尤其是增大数据集的多样性,但是数据增强的手端是有限的,不要去生成实际中不太可能存在的情况。
增加正则化:防止过拟合,过拟合一般出现在全连接层,可以通过dropout和增加正则化项来防止过拟合。
增大网络模型:当网络越大,网络的表达能力越强,就越不容易过拟合
提前停止训练的前面阶段网络可能在学习规律,但是从后面开始可能开始拟合数据集中的噪声,所以提早结束可以防止过拟合,多早结束呢?可以由验证集的训练结果来确定,所以在训练中,添加验证集是非常有必要的事情;如下图所示:
在这里插入图片描述
迁移学习:当数据量较小时,预加载在大数据集上训练好的参数模型很重要(ImageNet等等),可以有效防止过拟合;
个人觉得过拟合跟模型大小没有必然关系,主要跟数据量大小有关,当然模型越大,越容易过拟合也是必然的~因为过拟合的定义是:当模型学习到训练数据中的细节和噪声,以至于对新数据的模型性能产生负面影响时,就会发生过度拟合。这意味着训练数据中的噪声或随机波动被模型作为概念来提取和学习。关于过拟合的本质原因,感觉以下的解释非常好:

  1. 训练集和测试机特征分布不一致:
    假如给一群天鹅让机器来学习天鹅的特征,经过训练后,知道了天鹅是有翅膀的,天鹅的嘴巴是长长的弯曲的,天鹅的脖子是长长的有点曲度,天鹅的整个体型像一个“2”且略大于鸭子.这时候你的机器已经基本能区别天鹅和其他动物了。但是很不巧训练集中的天鹅全是白色的,于是机器经过学习后,会认为天鹅的羽毛都是白的,以后看到羽毛是黑的天鹅就会认为那不是天鹅。可以看到,训练集中的规律,“天鹅的体型是全局特征”,但是“天鹅的羽毛是白的”这实际上并不是所有天鹅都有的特征,只是局部样本的特征。机器在学习全局特征的同时,又大量学习了局部特征,这才导致了泛化能力变产,最终导致不能识别黑天鹅的情况.
  2. 在有限的样本中搜索过大的模型空间
    在高中数学我们知道,从 n 个(线性无关)方程一定可以解 n 个变量,但是解 n+1 个变量就会解不出。因为有2个变量可能不在一个维度上。
    在监督学习中,往往数据(对应了方程)远远少于模型空间(对应了变量)。
    在有监督学习中,如果训练样本数小于模型搜索空间,则有限的训练数据不能完全反映出一个模型的好坏,然而我们却不得不在这有限的数据上挑选模型,因此我们完全有可能挑选到在训练数据上表现很好而在测试数据上表现很差的模型,因为我们完全无法知道模型在测试数据上的表现。显然,如果模型空间很大,也就是有很多很多模型可以给我们挑选,那么挑到对的模型的机会就会很小。
  3. 训练过程中函数过多吸收了噪音数据的影响
    fit model的时候加的parameter太多了,导致model太精准地抓住了这组数据的所有variance,不管是主要的数据趋势带来的variance还是噪音带来的variance都一并被拟合在了模型里。
    用这个模型去预测原数据肯定是准确性更高,但放在一组具有相同趋势但细节不同的数据里时,预测效果就会下降。

猜你喜欢

转载自blog.csdn.net/weixin_39326879/article/details/113582391
今日推荐