训练,验证,测试
在机器学习的小数据时代,70%验证集,30%测试集,或者60%训练,20%验证和20%测试。大数据时代,如果有百万条数据,我们可以训练集占98%,验证测试各占1%。
深度学习的一个趋势是越来越多的训练集和测试集分布不匹配,根据经验,我们要确保两个数据集来自同一分布。
测试集的作用是给最后的模型提供无偏估计,如果不需要无偏估计,也可以不设置测试集
偏差,方差
考虑如下的数据,如果采用线性模型,可能会导致高偏差就是不能较好的拟合数据,称为欠拟合;而如果拟合一个非常复杂的分类器,可能会导致高方差,称为过拟合。
我们想要达到的是中间的情况
诊断方差和偏差的方式通过分析在训练集和验证集的的误差。
方差是通过查看训练集和验证集的误差,加入训练集误差为1%,验证集误差为11%,则可能是过度拟合,导致高方差。偏差,加入训练集误差15%,测试集误差16%,而人的误差为1%,这是我们认为偏差过大,而方差合理。
机器学习基础
通常首先看偏差,如果偏差很大,尝试选择不同的神经网络结构和延长训练时间,直到可以拟合数据为止。
当偏差降到可以接受的数值,再查看方差,通过验证集性能。如果方差过大,可以通过增加数据集、正则化等方法,不断尝试。
在正则适度的情况,一个更大的网络可以在不影响方差的同时减少偏差;采取更多的数据可以在不过多影响偏差的前提下减少方差。
正则化
正则化和增加数据是解决过拟合问题(高方差)的有效方法,正则化参数是
是训练样本的个数,称为的欧几里得范数(2范数)的平方,包含了每一层的w的元素的平方和,此方法称为L2正则化。因为包含了绝大多数参数,所以参数b可以不加。L1正则加的则是,使用L1正则,w会变得稀疏,但却没有降低太多内存。具体计算如下
在反向传播时加上,则计算梯度时相当于给梯度W乘了,该值小于1,因而正则化也被称为权重衰减。
直观理解正则化,w权重的值需要有一定的约束,当增大w的同时,我们在损失函数计算上加上该权重的平方,使其承受一定的损失,有助于维持模型的稳定。下面我们借助激活函数,我们通过正则化权重衰减w值较小,则获取的z也会较小,再通过激活函数时,就会处于下图中红线段,近似于线性函数,而不是一个高度复杂的非线性函数,从而减少过拟合。
dropout正则化
dropout会遍历网络的每一层,把每个节点以一定的概率消除,得到一个节点更少规模更小的网络,然后使用backprop。
使用正则化最常用的方法反向随机失活如下:
首先生成一个与每层W相同的矩阵,0~1的随机数
d = np.random.rand(w.shape[0],w.shape[1])<keep_size
然后看是否大于0.8(假设keep prob=0.8),大于0.8的我们置为0
然后与权重元素相乘
w = np.multipy(w,d)
然后将w向外扩展,除以0.8,用来修正我们所需的那20%,
最后,测试阶段不需要dropout,因为测试阶段进行预测时,我们不希望输出结果是随机的。
理解 dropout
dropout会使得不能依赖于任何一个特征,产生收缩权重的平方范数的效果,与之前的L2正则化效果类似,实施dropout会压缩权重,来预防过拟合;L2对不同权重的衰减是不同的,它取决于激活函数倍增的大小。
总结一下,dropout功能类似于L2,与L2不同的是,应用的方式的不同会导致dropout的不同,甚至更适用于不同的输入范围。
关于keep-prob的设置,对于W矩阵过大的神经层可以考虑较小的keep-prob,如果某一层不担心出现过拟合,keep-prob可以为1。
dropout的应用主要在计算机视觉,因为没有足够的数据,很容易造成过拟合。如果不存在过拟合的情况,不需要使用dropout。
当然,dropout的一大缺点就是代价函数J不再被明确定义,梯度下降的性能难于复查。
其他正则化方法
数据扩增,通过图像裁剪、翻转等数据处理,增大数据集
early stopping 代表提早停止训练,如下图,通过提早结束训练来减少过拟合的情况。
early stopping的优点是,只运行一次梯度下降,就可以找到w的较小值,中间值和较大值,无需的很多值,缺点是不能独立处理两个问题,提早停止梯度下降,也就停止了优化代价函数J,所以代价函数可能不够小,但是又不希望出现过拟合。
归一化输入
我们希望无论是训练集还是测试集都是经过相同的均值和方差定义的数据转换
- 零均值
- 归一化方差
如下图,假设有两个维度,通过零均值化和标准化,零均值化就是每一个维度减去维度的平均值,标准化则是所有零均值化后的数据除以方差
通过归一化可以使代价函数更平均,以参数w和参数b为例,如下图,归一化后特征都在相似的范围内,而不是1到1000,0到1,使得代价函数优化起来更加简单快速。图二中的结果函数是一个更圆的球形轮廓,那么不管从哪个位置开始,梯度下降法都能更直接的找到最小值。
梯度爆炸/梯度消失
梯度爆炸和消失是指在训练神经网络的时候,导数或坡度变得非常大或非常小。比如我们只考虑初始的一种情况,一个L层的网络,假设激活函数为线性函数,每一层的有两个神经元假设为1.5倍的单位矩阵,那么预测结果,如果对于深度神经网络L较大,那么预测的y值也会很大,实际上它是指数级增长的。同样如果为0.5倍的单位矩阵,会变得指数级下降。
神经网络的权重初始化我们想出了一个不完整的解决方案,有助于我们为神经网络更谨慎的选择随机初始化参数。
假设一个神经元接受四个输入
,暂时忽略,为了预防过大或过小,随着越大,应该越小,最合理的方法是设置,n表示输入神经元的特征数,实际上我们要做的是,就是我们喂给第l层神经单元的数量。通常relu激活函数引用高斯分布的方差,使用。
对于tanh激活函数,被称为Xavier初始化
以及
我们可以给上述参数再增加一个乘法参数,但上述方差参数的调优优先级并不高。通过上述的方法,我们确实降低的梯度爆炸和梯度消失问题。
所谓梯度检验,实际上是通过微分求导,即求导,这种方式计算的梯度更准确,但同时也耗费大量的计算资源。
梯度检验就是将损失函数J的所有参数W和b组成一个大的一维向量,然后依次对每一个参数利用微分求导,获得一个一维向量,同时反向传播的梯度也组成一个一维向量,两者求欧几里得距离。下图中的分母是为了防止分子的计算结果太小。通常取,如果计算的欧几里得距离为或者更小,说明导数逼近很可能是正确的。
注意以下几点:
- 不要在训练中使用梯度检验,它只用于调试,因为太费时了。
- 如果梯度检验失败,要检查,找出bug
- 如果使用了正则化,微分求导计算也要包含
- Dropout和梯度检验不要同时进行,或者将keepprob设为1
- 有时会出现当W和b较大时,梯度计算不正确,我们需要等到反复训练之后再检验梯度结果,但是这种情况几乎不会出现
本文参考
Coursera吴恩达《深度学习的实践层面》课程笔记(2)
第二周:深度学习的实践层面