1. 过拟合
1.1 什么是过拟合?
学习时选择的模型所包含的参数过多(由于一味追求对训练数据的拟合,导致模型过于复杂),以致于出现这一模型对已知数据预测得很好,但对未知数据预测的很差的现象,即泛化能力比较弱。
loss | auc | |
tain | 减少 | 升高 |
test | 增加 | 降低 |
训练误差持续降低,测试误差却在上升,auc相差2个百分点即为过拟合。
1.2 产生原因
1. 使用的model过于复杂,泛化能力差;
2. 数据的noise太大;
3. 训练数据有限。
1.3 解决方案
1.3.1 数据集扩增
基于Bootstrap重采样原理,在原始数据集上做一些改动,如图片旋转、缩放、剪切、添加噪声等。
1.3.2 减少选取特征的数量
(1)人工选择
(2)算法选取
1.3.3 正则化(regularization)
在损失函数中增加一个用于描述模型复杂度的部分,如权重与阈值的平方和。
L1使网络中的W尽可能为0,相当于减少了网络复杂度,L2则是增加了惩罚项。
1.3.4 早停(early stopping)
将数据分成训练集和验证集,训练集用来计算梯度、更新连接权重和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权重和阈值。
1.3.5 去除噪音数据
数据清洗
1.3.6 droupout
在训练过程中随机使一定比例(0.5)的神经元失活。
Droupout原理(是一种正则化的方法)
当一组训练数据经过某一层神经元的时候,随机使这一层上的部分神经元失活,让数据只经过一部分神经元计算。
相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,对于同一组训练数据,利用不同的神经网络之后,求其输出的平均值可以减少overfitting。
对参数W的训练进行球形限制(max-normalization),对dropout的训练非常有用。
1.3.7 soft weight sharing
权重共享
1.3.8 使用验证集
Validation data 就是用来避免过拟合的,在训练过程中,通常用它来确定一些超参数,如根据验证集上的auc来确定early stopping的epoch大小。
如果在testing data上做这些,那么随着训练的进行,我们的网络实际上就是在一点点的overfiting我们的test data,导致最后得到的test acc 没有任何参考意义。
2. 欠拟合
2.1 定义
模型在训练和预测时都表现不好的情况(即在训练数据和未知数据上表现都很差)。
2.2 解决方案
1. 添加其他特征项(组合|泛化|相关性);
2. 添加多项式特征;
3. 减少正则化参数。
3. 参数寻优----全局最小
通常采用以下策略来试图“跳出”局部极小,从而进一步接近全局最小。
(1) 以多组不同参数值初始化多个神经网络,训练后,取其中误差最小的解作为最终参数。
相当于从多个不同的初始点开始搜索,这样就可能陷入不同的局部极小,从中进行选择有可能获得更接近全局最小的结果。
(2) 使用“模拟退火”技术,在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小。
在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定。
(3) 使用随机梯度下降,SGD在计算梯度时加入了随机因素,所以即便陷入了局部极小点,其计算出的梯度仍可能不为0,这样就有机会跳出局部极小继续搜索。
(4) 遗传算法也常用来训练NN以更好地逼近全局最小。
备注: 以上用于跳出局部极小的技术大多是启发式,理论上尚缺乏保障。