开始学第二部分啦~
- 训练集、验证集和测试集
训练集用来训练神经网络;(学习)
验证集用来调节超参数,并监控模型是否过拟合,可多次使用;(写作业)
测试集用来评估模型的泛化能力,仅使用一次。(期末考试)
参考大佬的博客,讲解的很明白 https://blog.csdn.net/kieven2008/article/details/81582591
在传统学习中,数据集很少,通常可以划分为7/3,或8/1/1,在深度学习中,数据集很大,如果有一百万个数据集,那么验证集和测试集为一万就够了,98/1/1.这是因为如果验证集和测试集的数据很大,那么调参一次所需的时间就很长,影响了调参效率和工作进度。
tips: 保证验证集和测试集要服从同一分布。
-
偏差和方差
假设人眼辨别的错误率(也称贝叶斯误差)接近于0,同时训练集和验证集是同意分布的,那么若训练集误差很大,表示偏差高,欠拟合;若验证集和训练集的误差相差很大,说明方差高,过拟合。 -
偏差和方差解决办法
首先查看是否是高偏差,如果是的话,尝试 增大网络层数,增大训练时间,和选择其他模型三种方法,知道偏差降低到合适值。
之后再查看是否高方差,如果是的话,尝试 增大数据集,正则化,和选择其他模型三种方法。
当两者都降低后,调试成功。
但偏差和方差可能相互关联,当方差降低后可能偏差升高。这是需要权衡偏差和方差问题。 -
L2正则化 Regularization
逻辑回归正则化
神经网络正则化
在矩阵中,L2范数也成为 the Frobenuis norm,用下标F标注。
神经网络的正则化也叫“weight decay”,因为w前面乘了一个小于1的系数,使得w在迭代过程中总是减小的。
当lambda足够大时,为了使J(w,b)很小,W就会变得非常小,接近于0,相当于神经网络中的很多神经元都为0,不起作用,神经网络被简化,使得模型不再过拟合,从而减小方差。
lambda也是一个超参数,可以进行调节,如果lambda过大,可能会导致“oversmooth”,使得精度降低,欠拟合。
tip:在设参数lambda时,由于python内设参数为“lambda”,因此要改写为“lambd”。
- Dropout Regularization
Inverted dropout
将矩阵中一些元素随机设为0,以简化网络。X = (X < keep_prob).astype(int)
,其中.astype(int)
是将输出的布尔值(True, False)转换成int。keep-prob表示元素保留的概率。最后要除以keep-prob,以保证a的期望跟之前保持不变。这样在测试集时就可以不用doprout也能保证最后的测试值值是合理的。
dropout的好处是不依赖任何一个特征,因为每个神经元都有可能被消除,这样就不会在某个特征上加过多的权重。即压缩权重Shrink weights。与L2不同的是,L2对于不同的权重的衰减是不同的,依赖于w的大小,而dropout不依赖任何一个权重。因此,dropout更适用于不同scale的输入特征。
缺点,cost function J的定义不明确,使得J可能不会随迭代次数增加而下降。解决办法是先关闭dropout,确定J是下降的,然后再使用dropout进行调试。
-
其他正则化方法
扩增数据集
提早停止训练
缺点是提早停止训练一般不可能同时满足J很小和不过拟合两个条件。因此一般使用Orthogonalization。 -
Normalization 归一化
需要注意的一点是,在测试集上使用的均值和方差要与训练集相同。原因在于,当所有的特征在相似范围内时,可以使学习算法运行得更快。 -
梯度爆炸和梯度消失 exploding / vanishing gradients
当权重小于1时,深层网络会导致梯度呈指数衰减,逐渐变为0,参数无法更新。训练无法继续优化。
当权重初始化到较大的值时,梯度呈指数级增长,使得更新值过大,导致梯度爆炸。
解决办法:Xavier initialization
-
梯度检验
通过双边检验判断梯度是否正确。
将W和breshape呈一个大的矩阵θ。
检查θ的近似值和求得的值是否接近。
一些注意事项。
np.random.rand() 生成[0,1)均匀分布的随机数
np.random.randn() 生成服从标准正态分布的随机数,均值为0,方差为1.
PS:在学梯度爆炸和梯度消失那节课时,我想到了上周的作业里我自己编的一个程序,cost从0.69开始下降,下降到0.59就再也不降了,于是我查看了一下parameter的更新情况,发现经过几次迭代之后w已经下降到e-3甚至e-4量级了,瞬间明白过来,是梯度消失导致更新缓慢cost下不去了。因此用了一下新学的方法,在初始化时乘了np.sqrt(2./layer_dim[l-1])
, 再运行一下,成功了!
困扰了我一周的bug居然是这样解决的!学无止境!