常见的过拟合解决方法
1.L1和L2正则化
L1和L2正则化来避免过拟合是大家都知道的事情,而且我们都知道L1正则化可以得到稀疏解,L2正则化可以得到平滑解,这是为什么呢?有几种解释吧,可以参考(https://blog.csdn.net/f156207495/article/details/82794151) 。主要有几个方面:
1)直观的从图像上观察结论
2)通过对梯度的求解进行解释
3)通过L1正则和L2正则假设的参数先验上进行解释。
(L1正则化可通过假设权重w的先验分布为拉普拉斯分布,由最大后验概率估计导出。
L2正则化可通过假设权重w的先验分布为高斯分布,由最大后验概率估计导出。)
因为拉普拉斯的分布相比高斯要更陡峭,它们的分布类似下图,红色表示拉普拉斯,黑色表示高斯。
![dc55d2dce5b33e9fde82dbd4947170be.png](https://i-blog.csdnimg.cn/blog_migrate/eb9ca374c7c931e39615d7cea3b6c5dc.png)
可以看出拉普拉斯的小w的数目要比高斯的多,w的分布陡峭,而高斯的w分布较为均匀。也就是说,l1正则化更容易获得稀疏解,还可以挑选重要特征。l2正则有均匀化w的作用。
![1d7753828ef394b3d5d6746a28a7d37f.png](https://i-blog.csdnimg.cn/blog_migrate/46a8392d5def97f4defea168b4bfdb84.png)
2.数据增强
获取更多数据,这是最直观也是最有效的方式之一,有了足够的数据网络也不太容易过拟合了;
通俗得讲,数据增强即需要得到更多的符合要求的数据,即和已有的数据是独立同分布的,或者近似独立同分布的。一般有以下方法:
1)从数据源头采集更多数据
2)复制原有数据并加上随机噪声
3)重采样
4)根据当前数据集估计数据分布参数,使用该分布产生更多数据等
3.Early stopping
Early stopping便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。因为在初始化网络的时候一般都是初始为较小的权值,训练时间越长,部分网络权值可能越大。如果我们在合适时间停止训练,就可以将网络的能力限制在一定范围内。
Early stopping可以得到与L2类似的参数平滑效果,可以通过定性和定量两个方面进行分析,具体参考 http://www.friskit.me/2017/03/27/l2-equals-to-stop-early/
4.dropout
dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。dropout为什么能防止过拟合,可以通过以下几个方面来解释:
- 它强迫一个神经单元,和随机挑选出来的其他神经单元共同工作,达到好的效果。消除减弱了神经元节点间的联合适应性,增强了泛化能力。
- 类似于bagging的集成效果
- 对于每一个dropout后的网络,进行训练时,相当于做了Data Augmentation,因为,总可以找到一个样本,使得在原始的网络上也能达到dropout单元后的效果。 比如,对于某一层,dropout一些单元后,形成的结果是(1.5,0,2.5,0,1,2,0),其中0是被drop的单元,那么总能找到一个样本,使得结果也是如此。这样,每一次dropout其实都相当于增加了样本。
dropout在测试时,并不会随机丢弃神经元,而是使用全部所有的神经元,同时,所有的权重值都乘上1-p,p代表的是随机失活率。
![8096eab5c7d31abe09cfc4c98663e889.png](https://i-blog.csdnimg.cn/blog_migrate/605ce0cfafecd1e592a01d972c4775e0.jpeg)
测试时为什么要乘1-p呢?
可以像上图这样理解,p为0.5时,在测试阶段得到的值会等于训练时的两倍,所以乘上1-p的系数就可使二者近似相等。
5.交叉验证
交叉验证的基本思想就是将原始数据(dataset)进行分组,一部分做为训练集来训练模型,另一部分做为测试集来评价模型。我们常用的交叉验证方法有简单交叉验证、S折交叉验证和留一交叉验证。
6.决策树剪枝
在决策树学习中将已生成的树进行简化的过程称为剪枝。又分为前剪枝和后剪枝。
7.选择合适的网络结构,通过减少网络层数、神经元个数、全连接层数等降低网络容量;
8.模型组合,Baggging &Boosting,将弱分类器融合之后形成一个强分类器,而且融合之后的效果会比最好的弱分类器更好;
9. Batch Normalization,一种非常有用的正则化方法,可以让大型的卷积网络训练速度加快很多倍,同时收敛后分类的准确率也可以大幅度的提高。BN在训练某层时,会对每一个mini-batch数据进行标准化(normalization)处理,使输出规范到N(0,1)的正态分布,减少了Internal convariate shift(内部神经元分布的改变),传统的深度神经网络在训练是,每一层的输入的分布都在改变,因此训练困难,只能选择用一个很小的学习速率,但是每一层用了BN后,可以有效的解决这个问题,学习速率可以增大很多倍。