深度学习的实践层面个人学习笔记 Practical aspects of Deep Learning
作者:arsoooo
1.1 训练,验证,测试集(Train / Dev / Test sets)
在机器学习发展的小数据量时代,常见做法是将所有数据三七分,就是人们常说的70%验证集,30%测试集,如果没有明确设置验证集,也可以按照60%训练,20%验证和20%测试集来划分。这是前几年机器学习领域普遍认可的最好的实践方法。
在机器学习中,我们通常将样本分成训练集,验证集和测试集三部分,数据集规模相对较小,适用传统的划分比例,数据集规模较大的,验证集和测试集要小于数据总量的20%或10%。后面我会给出如何划分验证集和测试集的具体指导。
1.2 偏差,方差(Bias /Variance)
假设这就是数据集,如果给这个数据集拟合一条直线,可能得到一个逻辑回归拟合,但它并不能很好地拟合该数据,这是高偏差(high bias)的情况,我们称为“欠拟合”(underfitting)。
相反的如果我们拟合一个非常复杂的分类器,比如深度神经网络或含有隐藏单元的神经网络,可能就非常适用于这个数据集,但是这看起来也不是一种很好的拟合方式分类器方差较高(high variance),数据过度拟合(overfitting)。
简单记就是:
高偏差(high bias) = “欠拟合”(underfitting)
高方差(high variance)= 过拟合(overfitting)
如何判断欠拟合还是过拟合?
1.假定训练集误差是1%,为了方便论证,假定验证集误差是11%,可以看出训练集设置得非常好,而验证集设置相对较差,我们可能过度拟合了训练集。
2.假设训练集误差是15%,我们把训练集误差写在首行,验证集误差是16%,假设该案例中人的错误率几乎为0%,人们浏览这些图片,分辨出是不是猫。算法并没有在训练集中得到很好训练,如果训练数据的拟合度不高,就是数据欠拟合。
也就是说 偏差 就是和应该有的能力进行比较,差别太大就是欠拟合
而 方差 就是训练集的结果和测试集结果进行比较,差别大就是过拟合
所以在实际操作中,采用线性函数会产生高偏差(欠拟合),采用曲线函数或二次元函数会产生高方差(过拟合)。
在当前的深度学习和大数据时代,只要正则适度,通常构建一个更大的网络便可以在不影响方差的同时减少偏差,而采用更多数据通常可以在不过多影响偏差的同时减少方差。
1.3 正则化(Regularization)
正则化听起来复杂,事实上Regularization就是规范化、调整、正规化的意思,在这里就是把代价函数J进行规范化处理:
λ是正则化参数,我们通常使用验证集或交叉验证集来配置这个参数,所以λ是另外一个需要调整的超级参数。
1.4 为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitting?)
我们的代价函数J含有参数W,b。我们添加正则项,它可以避免数据权值矩阵过大,这就是弗罗贝尼乌斯范数,为什么压缩L2范数,或者弗罗贝尼乌斯范数或者参数可以减少过拟合?
直观上理解就是如果正则化λ设置得足够大,权重矩阵W被设置为接近于0的值,直观理解就是把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响。如果是这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,它会使这个网络从过度拟合的状态更接近左图的高偏差状态。
比如这个tanh函数,当W变小,z会很小,这样这个非线性函数只使用了他线性的那一段,所以往欠拟合的方向去了。
1.5 归一化输入(Normalizing inputs)
训练神经网络,其中一个加速训练的方法就是归一化输入。假设一个训练集有两个特征,输入特征为2维,归一化需要两个步骤:
1.零均值
2.归一化方差
1的操作方法就是把这些值减去他们的均值。2的操作方法就是把这些值除以他们的方差