Practical aspects of Deep Learning
本周,我们将继续学习如何有效运作神经网络,内容涉及超参数调优,如何构建数据,以及如何确保优化算法快速运行,从而使学习算法在合理时间内完成自我学习。
1.1 训练,验证,测试集(Train / Dev / Test sets)
训练神经网络时,我们需要做出很多决策,例如:
- 神经网络分多少层
- 每层含有多少个隐藏单元
- 学习速率(步长 α \alpha α)是多少
- 各层采用哪些激活函数
所以通常深度学习是一个典型的迭代过程,需要多次循环往复,才能为应用程序找到一个令人满意的神经网络,因此循环该过程的效率是决定项目进展速度的一个关键因素,而创建高质量的训练数据集,验证集和测试集也有助于提高循环效率。下面我们就来看看数据集上的一些术语:
数据集的划分
当我们拿到一个数据集后,我们通常会将其分为三部分:
- 训练集/train set
- 验证集/交叉验证集/dev set
- 测试集/test set
在机器学习发展的小数据量时代,常见做法是将所有数据三七分,就是人们常说的70%验证集,30%测试集,如果没有明确设置验证集,也可以按照60%训练,20%验证和20%测试集来划分。这是前几年机器学习领域普遍认可的最好的实践方法。
但是在如今的大数据时代,假设我们有100万条数据,那么拿其中1万条作为验证集,1万条作为测试集,就达到我们的需求 了。即:训练集占98%,验证集和测试集各占1%。对于数据量过百万的应用,训练集可以占到99.5%,验证和测试集各占0.25%,或者验证集占0.4%,测试集占0.1%。因为我们希望的是迅速判断出哪种算法更有效。
需要注意的事项
1.确保验证集和测试集的数据来自同一分布——举个例子,当我们的任务是对猫进行识别时,如果我们的测试集都是非常清晰的猫的图片,而测试集却是用户随意拍摄的、非常模糊的图片。那么我们训练出来的效果很可能就不符合我们的期望。
2.没有测试集也不要紧,测试集的目的是对最终所选定的神经网络系统做出无偏估计,如果不需要无偏估计,也可以不设置测试集。所以如果只有验证集,没有测试集,我们要做的就是,在训练集上训练,尝试不同的模型框架,在验证集上评估这些模型,然后迭代并选出适用的模型。因为验证集中已经涵盖测试集数据,其不再提供无偏性能评估。当然,如果你不需要无偏估计,那就再好不过了。
1.2 偏差,方差(Bias /Variance)
具体图像
尽管我们已经在概率论中学习过了方差和偏差的概念,还是有必要来看看深度学习中它们是如何表现的
假设这就是数据集,如果给这个数据集拟合一条直线,可能得到一个逻辑回归拟合,但它并不能很好地拟合该数据,这是高偏差(high bias)的情况,我们称为“欠拟合”(underfitting)。
相反的如果我们拟合一个非常复杂的分类器,比如深度神经网络或含有隐藏单元的神经网络,可能就非常适用于这个数据集,但是这看起来也不是一种很好的拟合方式分类器方差较高(high variance),数据过度拟合(overfitting)。
在两者之间,可能还有一些像图中这样的,复杂程度适中,数据拟合适度的分类器,这个数据拟合看起来更加合理,我们称之为“适度拟合”(just right)是介于过度拟合和欠拟合中间的一类。
第一个例子是高方差,第二个是高偏差,第三个是两个都很高,第四个则可能达到了我们满意的需求
1.3 机器学习基础(Basic Recipe for Machine Learning)
吴老师的训练神经网络时的基本方法:
初始模型训练完成后,首先要知道算法的偏差高不高,如果偏差较高,试着评估训练集或训练数据的性能。如果偏差的确很高,甚至无法拟合训练集,那么你要做的就是选择一个新的网络,比如含有更多隐藏层或者隐藏单元的网络,或者花费更多时间来训练网络,或者尝试更先进的优化算法。
如果网络足够大,至少可以拟合或者过拟合训练集。一旦偏差降低到可以接受的数值,下一步就该检查一下方差有没有问题,为了评估方差,我们要查看验证集性能,我们能从一个性能理想的训练集推断出验证集的性能是否也理想,如果方差高,最好的解决办法就是采用更多数据,如果你能做到,会有一定的帮助,但有时候,我们无法获得更多数据,我们也可以尝试通过正则化来减少过拟合,这个我们下节课会讲。有时候我们不得不反复尝试,但是,如果能找到更合适的神经网络框架,有时它可能会一箭双雕,同时减少方差和偏差。如何实现呢?想系统地说出做法很难,总之就是不断重复尝试,直到找到一个低偏差,低方差的框架,这时你就成功了。
1.4 正则化(Regularization)
正则化可以用于解决高方差问题
我们用逻辑回归来实现这些设想,求成本函数
J
J
J的最小值,它是我们定义的成本函数,参数包含一些训练数据和不同数据中个体预测的损失,
w
w
w和
b
b
b是逻辑回归的两个参数,
w
w
w是一个多维度参数矢量,
b
b
b是一个实数。在逻辑回归函数中加入正则化,只需添加参数λ,也就是正则化参数,一会儿再详细讲。
我们讲这个称作是
L
2
L2
L2正则化,至于
L
1
L1
L1就不说了,如果用的是
L
1
L1
L1正则化,最终
w
w
w会是稀疏的,也就是说向量中有很多0,有人说这样有利于压缩模型,因为集合中参数均为0,存储模型所占用的内存更少。实际上,虽然
L
1
L1
L1正则化使模型变得稀疏,却没有降低太多存储内存,所以我认为这并不是
L
1
L1
L1正则化的目的,至少不是为了压缩模型,人们在训练网络时,越来越倾向于使用
L
2
L2
L2正则化
1.5 为什么正则化有利于预防过拟合呢?(Why regularization reduces overfitting?)
正则化为什么可以预防过拟合,假设我们用的是这样的双曲线激活函数。
现在我们来看下这个庞大的深度拟合神经网络。这张图不够大,深度也不够,但你可以想象这是一个过拟合的神经网络。这是我们的代价函数
J
J
J,含有参数
W
W
W,
b
b
b。我们添加正则项
λ
\lambda
λ,它可以避免数据权值矩阵过大.
直观上理解就是如果正则化设置得足够大,权重矩阵被设置为接近于0的值,直观理解就是把多隐藏单元的权重设为0,于是基本上消除了这些隐藏单元的许多影响。如果是这种情况,这个被大大简化了的神经网络会变成一个很小的网络,小到如同一个逻辑回归单元,可是深度却很大,它会使这个网络从过度拟合的状态更接近左图的高偏差状态。
但是会存在一个中间值,于是会有一个接近“Just Right”的中间状态。
直观理解就是
λ
\lambda
λ增加到足够大,
W
W
W会接近于0,实际上是不会发生这种情况的,我们尝试消除或至少减少许多隐藏单元的影响,最终这个网络会变得更简单,这个神经网络越来越接近逻辑回归,我们直觉上认为大量隐藏单元被完全消除了,其实不然,实际上是该神经网络的所有隐藏单元依然存在,但是它们的影响变得更小了