相关定义
- 训练误差: 模型在训练数据集上表现出的误差。
- 泛化误差: 模型在任意⼀个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似,这里可以理解成测试集。
- 欠拟合: 模型⽆法得到较低的训练误差。
- 过拟合: 模型的训练误差远小于它在测试数据集上的误差。
通过上面的图,可以简单推出:
loss不下降,分多种情况:训练集不下降,验证集不下降,本文结合其它博客,做个小的总结:
训练损失与测试损失结果分析
训练损失不断下降 ↓ \downarrow ↓,测试损失不断下降 ↓ \downarrow ↓,说明网络仍在学习;
训练损失不断下降 ↓ \downarrow ↓,测试损失趋于不变 → \rightarrow →,说明网络过拟合;
训练损失趋于不变 → \rightarrow →,测试损失不断下降 ↓ \downarrow ↓,说明数据集有问题;
训练损失趋于不变 → \rightarrow →,测试损失趋于不变 → \rightarrow →,说明学习遇到瓶颈,需要减小学习率或批量数目;
训练损失不断上升 ↑ \uparrow ↑,测试损失不断上升 ↑ \uparrow ↑,说明网络结构设计不当,训练超参数设置不当。
欠拟合和过拟合
“欠拟合”常常在模型学习能力较弱,而数据复杂度较高的情况出现,此时模型由于学习能力不足,无法学习到数据集中的“一般规律”,因而导致泛化能力弱。与之相反,“过拟合”常常在模型学习能力过强的情况中出现,此时的模型学习能力太强,以至于将训练集单个样本自身的特点都能捕捉到,并将其认为是“一般规律”,同样这种情况也会导致模型泛化能力下降。过拟合与欠拟合的区别在于,欠拟合在训练集和测试集上的性能都较差,而过拟合往往能较好地学习训练集数据的性质,而在测试集上的性能较差。在神经网络训练的过程中,欠拟合主要表现为输出结果的高偏差,而过拟合主要表现为输出结果的高方差。注意,过拟合并不总是一件坏事,因为过拟合很容易调整。 在深度学习领域, 最好的预测模型在训练数据上的表现往往比在保留(验证)数据上好得多。 最终,我们通常更关心验证误差,而不是训练误差和验证误差之间的差距。
欠拟合原因
根本的原因是特征维度过少,导致拟合的函数无法满足训练集,误差较大。因此欠拟合问题可以通过增加特征维度来解决。
- 模型复杂度过低
- 特征量过少
欠拟合解决方案
欠拟合的解决方案有不少,下面几个仅供参考:
- 模型复杂化
对于同一个算法,通过添加其它层或者深度等来增加该算法的复杂度。例如回归模型添加更多的高次项,增加决策树的深度,增加神经网络的隐藏层数和隐藏单元数等,这个在机器学习算法里面用的很普遍,使模型泛化能力更强。
另外还可以弃用原来的算法,使用一个更加复杂的算法或模型。使用非线性模型,比如核SVM 、决策树、深度学习等模型(即使用非线性激活函数),例如用神经网络来替代线性回归,用随机森林来代替决策树。 - 增加更多的特征,使输入数据具有更强的表达能力
特征挖掘十分重要,尤其是具有强表达能力的特征,往往可以抵过大量的弱表达能力的特征。
特征的数量往往并非重点,质量才是,总之强表达能力的特征最重要。能否挖掘出强表达能力的特征,还在于对数据本身以及具体应用场景的深刻理解,往往依赖于经验。增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间。 - 调整参数和超参数
神经网络中:学习率、学习衰减率、隐藏层数、隐藏层的单元数、Adam优化算法中的β1和β2参数、batch_size数值等。其他算法中:随机森林的树数量,k-means中的cluster数,正则化参数λ等。 - 降低正则化约束
正则化约束是为了防止模型过拟合,如果模型压根不存在过拟合而是欠拟合了,那么就考虑是否降低正则化参数λ或者直接去除正则化项。减少正则化参数,正则化的目的是用来防止过拟合的,但是模型出现了欠拟合,则需要减少正则化参数(正则化有很多种,可以适当减少正则化) - 增加训练数据往往没有用
欠拟合往往是因为模型的学习能力不足,一味地增加数据,训练效果并不明显。这里需要注意一下。
过拟合原因
根本的原因则是特征维度过多,导致拟合的函数完美的经过训练集,但是对新数据的预测结果则较差。
过拟合解决方案
- 降低模型复杂度
其实过拟合正好与欠拟合相反,既然特征维度过多,就应该降低特征维度,即降低模型复杂度。
为了降低复杂度,我们可以简单地移除层或者减少神经元的数量使得网络规模变小。与此同时,计算神经网络中不同层的输入和输出维度也十分重要。虽然移除层的数量或神经网络的规模并无通用的规定,但如果你的神经网络发生了过拟合,就尝试缩小它的规模。 - 数据扩增,即增加训练数据样本,使用更大的数据集训练模型。
- 数据增强
使用数据增强可以生成多幅相似图像。这可以帮助我们增加数据集规模从而减少过拟合。因为随着数据量的增加,模型无法过拟合所有样本,因此不得不进行泛化。计算机视觉领域通常的做法有:翻转、平移、旋转、缩放、改变亮度、添加噪声等等,音频数据增强方法有:增加噪音、增加混响、时移、改变音调和时间拉伸。 - Dropout
该操作在深度学习里经常遇到,就是在学习过程中,丢掉一些神经元,即丢掉了一些特征维度,达到降低特征维度的效果。 - Early stopping
过拟合很多时候与学习次数过多有关,早期停止模型的训练也可以组织过拟合,我们最终的目标是在测试集达到更高的准确度。 - 正则化(Regularization)(L1和L2)
在损失函数后面加一个正则化项,常见的有L1正则化和L2正则化
L1惩罚项的目的是使权重绝对值最小化。公式如下:
L ( x , y ) = ∑ i = 1 n ( y i − h θ ( x i ) ) 2 + λ ∑ i = 1 n ∣ θ i ∣ L(x, y)=\sum_{i=1}^n(y_i-h_\theta(x_i))^2+\lambda\sum_{i=1}^n|\theta_i| L(x,y)=i=1∑n(yi−hθ(xi))2+λi=1∑n∣θi∣
L2惩罚项的目的是使权重的平方最小化。公式如下:
L ( x , y ) = ∑ i = 1 n ( y i − h θ ( x i ) ) 2 + λ ∑ i = 1 n ∣ θ i 2 ∣ L(x, y)=\sum_{i=1}^n(y_i-h_\theta(x_i))^2+\lambda\sum_{i=1}^n|\theta_i^2| L(x,y)=i=1∑n(yi−hθ(xi))2+λi=1∑n∣θi2∣
L1正则化 | L2正则化 |
---|---|
L1惩罚权重绝对值的总和 | L2惩罚权重平方和的总和 |
L1生成简单、可解释的模型 | L2正则化能够学习复杂数据模式 |
L1受极端值影响较小 | L2受极端值影响较大 |
如果数据过于复杂以至于无法准确地建模,那么L2是更好的选择,因为它能够学习数据中呈现的内在模式。而当数据足够简单,可以精确建模的话,L1更合适。对于我遇到的大多数计算机视觉问题,L2正则化几乎总是可以给出更好的结果。然而L1不容易受到离群值的影响。所以正确的正则化选项取决于我们想要解决的问题。
- 批量正则化(BN)
批量正则化在深度学习里经常被用到,特别是当容易发生过拟合的时候。批量正则化就是将卷积神经网络的每层之间加上将神经元的权重调成标准正态分布的正则化层,这样可以让每一层的训练都从相似的起点出发,而对权重进行拉伸,等价于对特征进行拉伸,在输入层等价于数据增强。注意正则化层是不需要训练。