过拟合
在训练集上表现很好,但在测试集上的泛化能力很差。这是因为模型记住了训练数据的所有特征,所以其在训练集上误差很小,但放在测试集上并不能得到好的结果
产生过拟合的原因:
- 数据量太少
- 模型太复杂,拟合能力太强
- 训练集和测试集的分布不一致
- 训练集噪声太多,模型拟合了噪声,导致其对正常样本的预测能力下降
解决过拟合的方法:
- 数据方面:找更多数据,基于已有数据增广,加噪声,平衡分布(类别平衡,训练集测试集分布平衡)
- 模型:使用更小的网络,集成学习(bagging,boosting),dropout,batch Normalization
- 损失函数:正则化,标签平滑(0, 1, 0, 0, 0, 0 ->0.1, 0.5, 0.1, 0.1, 0.1, 0.1),平衡分类(在损失函数中,对数量不同的各类数据,采用不同的权重。多的权重大,少的权重小),early stop
正则化:减小权重w的值
L2正则化就是在代价函数后面再加上一个正则化项:
C0代表原始的代价函数,后面那一项就是L2正则化项,它是这样来的:所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。另外还有一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整。
L2正则化项是怎么避免overfitting的呢?我们推导一下看看,先求导:
可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响:
在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为 1−ηλ/n ,因为η、λ、n都是正的,所以 1−ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。
在原始的代价函数后面加上一个L1正则化项,即所有权重w的绝对值的和,乘以λ/n(这里不像L2正则化项那样,需要再乘以1/2,具体原因上面已经说过。)
同样先计算导数: