1 基本概念
training, validition, testing set:一般将数据分为训练集、验证集和测试集。小数据6:3:1,大数据98:1:1。验证集的意义是指导炼丹方向。测试集用来评价模型。不应该根据测试集来指导模型优化。
泛化误差包括偏差和方差
- 偏差:所有训练数据集训练出的模型输出的结果和真实结果的差异。可以用loss的均值衡量
- 方差:不同训练数据集训练出的模型输出的结果之间的差异。用loss的方差衡量
2 欠拟合
欠拟合时,没有学习充分,所以训练及验证集的loss都比较高,此时会出现高偏差high bias,低方差low variance,因为没充分所以不同训练集带来的结果不会有太大不同。根据可能的原因就可以得出可能的改进方法:
- 数据的特征不够明显,学不到什么东西:增加数据的特征,尤其是优质特征。这属于特征工程的工作
- 模型不够复杂:增加模型复杂度,以及减小正则化项的系数
- 梯度更新速度太慢,还没收敛到合适程度就跑完了:
- 增加训练次数。除了粗暴增大epoch之外,也可以用mini-batch,这样所有样本跑过一个epoch之后参数已经更新了很多次(这个几乎已经是默认设置了)
- 遇到了局部最小、鞍点等:换优化方法,如RMSProp,Adam,动量梯度下降等
- 学习率太大导致在最低点附近震荡:降低学习率或使用自适应学习率
- 遇到了梯度消失/爆炸,低层没学到,高层瞎学。不过梯度问题和震荡一样,很容易就会表现出来,一般不会在找欠拟合原因的时候才看到。
- 换激活函数,如ReLU,Maxout
- BN(然而BN还有一点点正则化作用)
3 过拟合
对训练集的loss很低,但是对验证集的loss高,说明学习过度,降低了泛化能力
此时会出现高偏差high bias和高方差high variance
- 最朴素的思想——训练到一定程度其实就可以了,但继续迭代优化导致过度训练:Early stopping。可是什么时候停才合适呢?可以监测验证集的loss,设置多少代以内不再降低时就停止
- 模型比较复杂,而数据量不够:简化模型、扩充数据。搜集更多数据或者使用数据增强,能的话这个方法是首选的
- 还是模型复杂,不换结构的话:
- 表现在神经网络上,就是神经元、连接太多:使用dropout。此方法可以构造多种稀疏连接最后再组合(其实相当于换结构)
- 更通用的方法:正则化。通过给损失函数增加正则化项抑制参数的取值。L1正则会造成稀疏,L2更平滑