偏差和方差及其解决办法
训练神经网络时,我们会有一个训练集,一个测试集,人在这件事上几乎是不会出错的
当训练集精度为99%,而测试集精度为90%时
这时就是出现了过拟合,我们称他为方差较高
当训练集精度为85%,测试集精度也为85%时
这就是拟合的不好,我们称他为高偏差
为了之后表达方便我称训练集精度为a,测试集精度为b
高方差的解决办法:
出现高方差时一般是,a,b先一起上升,然后到某一点之后 a继续上升b开始下降
Early Stopping
我常用的就是训练时,每训练100次输出一次训练集精度,每1k次保存一次模型
一旦发现b开始下降了,就停止训练
这里定义下什么叫做b开始下降
不是说连续300次训练b都在下降就叫b开始下降了
最好是连续1000 - 2000次训练b都在下降才能叫做b开始下降了
因为b是会有波动的,偶尔几次下降是正常行为
另外的解决办法是正则化
因为神经网络过拟合的根本原因就是网络设计的过于复杂了
正则化就是一种把网络简化的方法
drop out 正则化:
在训练神经网络时,按照一定的概率去更新节点
其实网络会过拟合
每一次学习时,这次让一部分节点学习,下次让另一部分节点学习
这样每次学习就能学到不同的过拟合特征
最后再用的时候,过拟合相互抵消,就解决了过拟合的问题
L2正则化:
将loss改为loss = loss + (a/2n)*(w1 * w1 + w2 * w2 + ....... + wm * wm)
a为自己指定的系数,n为样本个数,w就是我们训练时的w
这样的话,在做反向传播的时候dwi = dwi + (a/n) * wi
wi = wi - learning_rate * dwi
那么那个多出来的东西会使无论此时的wi是什么,我们都会试图让他变得更小
让w趋近于0,就会弱化这个神经元对结果的影响,达到了减小神经网络复杂度的效果
高偏差的解决办法:
高偏差没什么好说的,就是神经网络太简单了呗
这时候要么继续训练,要么加数据,要么就加节点,加层数
最好不要加层数,因为3层的神经网络已经可以表示一切连续函数了
没必要多加