过拟合的原因和解决方法

过拟合的原因

1、数据量太小

    这个是很容易产生过拟合的一个原因。设想,我们有一组数据很好的吻合3次函数的规律,现在我们局部的拿出了很小一部分数据,用机器学习或者深度学习拟合出来的模型很大的可能性就是一个线性函数,在把这个线性函数用在测试集上,效果可想而知肯定很差了。

2、训练集和验证集分布不一致

训练集训练出一个适合训练集那样分布的数据集,当你把模型运用到一个不一样分布的数据集上,效果肯定大打折扣。这个是显而易见的。

3、模型复杂度太大

在选择模型算法的时候,首先就选定了一个复杂度很高的模型,然后数据的规律是很简单的,复杂的模型反而就不适用了。

4、数据质量很差

数据还有很多噪声,模型在学习的时候,肯定也会把噪声规律学习到,从而减小了具有一般性的规律。这个时候模型用来预测肯定效果也不好。

5、过度训练

这个是同第4个是相联系的,只要训练时间足够长,那么模型肯定就会吧一些噪声隐含的规律学习到,这个时候降低模型的性能是显而易见的。

过拟合的解决方法

针对过拟合的原因我们可以有针对性的来使用一些方法和技巧来减少过拟合。

1、模型层面
这里主要是减小模型的复杂度,主要是从模型包含的参数个数和参数值。

a、正则化

这里包含L1和L2范数,具体的区别去看相关的理论去了解,这里一般使用L1范数,使得模型拟合的参数大部分都为0,这样就可以说从参数值和参数个数的角度减少了模型的复杂度,从而降低了过拟合。

b、权值共享

这个方法常用于深度学习中,一般在网络中,某些层可能会使用同样的参数,那么这样就在参数个数上减小了——模型复杂度也随之降低

c、dropout

这个方法也很常见,在神经网络中以一定的概率使得神经元不工作。这种方法的本质上是没一个step中,使用的模型都是不一样的,并且模型参数在一定程度上也是减少了。

torch.nn.Dropout(0.5)
在pytorch中,这里的0.5的意思就是神经元不保留的概率,这个与tf框架不同。

d、Batch Normalization

这个批归一化处理层,是一个作用非常大的。我自己在写网络中也尝试在使用这个BN层,其作用是:使得每一层的数据分布不变,做归一化处理,加快了模型的收敛速度,避免梯度消失、提高准确率。反正就是优点很多!

e、权值衰减

权值衰减——weight_decay,简单的理解就是乘在正则项的前面的系数,目的是为了使得权值衰减到很小的值,接近如0。一般在深度学习好中,pytorch的提供的优化器都可以设置的:

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9,weight_decay=1e-5)
2、数据层面
a、保证数据集分布一致性

在切分数据集的时候要保证分布一致性。可以使用sklearn包中,model_selection相关train_text_split来实现数据集切割后分布的一致性。

b、增加数据集的规模

最好的是人工标注高质量的数据,但是成本非常高;可以采用一定的数据增强策略,来实现数据集的扩充。注意的是这里可能会引入一定的噪声,噪声也会影响模型的性能的,要注意利弊的取舍。另外CV和NLP的数据增强是不一样的,NLP数据增强更难。

3、训练层面
这个训练就要看经验了,模型需要到达什么样的一个基线标准。然后参考这个标准对模型实施early-stopping。神经网络的训练过程中我们会初始化一组较小的权值参数,随着模型的训练,这些权值也变得越来越大了。为了减小过拟合的影响,就有可能需要早停止了。我本人没有使用过early-stopping,一般都是设置10个epoch然后看效果来考虑时候增加epochs的次数。

4、其他
集成学习——也就是一个均值的思想,通过集成的思想来减弱过拟合的影响。

猜你喜欢

转载自blog.csdn.net/zhonglongshen/article/details/115331295
今日推荐