第一周:深度学习的实践层面 (Practical aspects of Deep Learning)
1.1 训练,验证,测试集(Train / Dev / Test sets)
创建新应用的过程中,不可能从一开始就准确预测出一些信息和其他超级参数,例如:神经网络分多少层;每层含有多少个隐藏单元;学习速率是多少;各层采用哪些激活函数。应用型机器学习是一个高度迭代的过程。
从一个领域或者应用领域得来的直觉经验,通常无法转移到其他应用领域,最佳决策取决于 所拥有的数据量,计算机配置中输入特征的数量,用 GPU 训练还是 CPU,GPU 和 CPU 的具体配置以及其他诸多因素。
对于很多应用系统,即使是经验丰富的深度学习行家也不太可能一开始就预设出最匹配的超级参数,所以说,应用深度学习是一个典型的迭代过程,需要多次循环往复,才能为应用程序找到一个称心的神经网络,因此循环该过程的效率是决定项目进展速度的一个关键因素,而创建高质量的训练数据集,验证集和测试集也有助于提高循环效率。
通常会将这些数据划分成几部分,一部分作为训练集,一部分作为简单交叉验证集,有时也称之为验证集(dev set)最后一部分则作为测试集。
在机器学习发展的小数据量时代,常见做法是将所有数据三七分,就是 70% 验证集,30%测试集,如果没有明确设置验证集,也可以按照60%训练,20%验证和20%测试集来划分。
在大数据时代,那么验证集和测试集占数据总量的比例会趋向于变得更小。因为验证集的目的就是验证不同的算法,检验哪种算法更有效, 因此,验证集要足够大才能评估,比如 2 个甚至 10 个不同算法,并迅速判断出哪种算法更有效。可能不需要拿出20%的数据作为验证集。验证集和测试集要小于数据总量的 20%或 10%。
根据经验,建议要确保验证集和测试集的数据来自同一分布。因为要用验证集来评估不同的模型,尽可能地优化性能。 如果验证集和测试集来自同一个分布就会很好。
最后一点,就算没有测试集也不要紧,测试集的目的是对最终所选定的神经网络系统做出无偏估计,如果不需要无偏估计,也可以不设置测试集。
1.2 偏差,方差(Bias /Variance)
过拟合、欠拟合概念
欠拟合:不能很好地拟合数据,是高偏差(high bias)的情况
过拟合:方差较高(high variance)
适度拟合(just right):介于过度拟合和欠拟合 中间的一类
“高方差”:
假定训练集误差是 1%,验证集误差是 11%,训练集设置得非常好,而验证集设置相对较差,可能过度拟合了训练集,在某种程度上,验证集并没有充分利用交叉验证集的作用
“高偏差”:
假设训练集误差是 15%,验证集误差是 16%,人的错误率几乎为 0%,算法并没有在训练集中得到很好训练,训练数据的拟合度不高,就是数据欠拟合,就可以说这种算法偏差比较高。
它对于验证集产生的结果却是合理的,验证集中的错误率只比训练集的多了 1%,但这种算法偏差高,因为它甚至不能拟合训练集。
高、低|方差和偏差:
训练集误差是 15%,偏差相当高,但是,验证集的评估结果更糟糕,错误率达到 30%,在这种情况下,会认为这种算法偏差高,因为它在训练集上结果不理想, 而且方差也很高,这是方差偏差都很糟糕的情况。
训练集误差是 0.5%,验证集误差是 1%,只有 1%的错误率,偏差和方差都很低。
以上分析的前提都是假设基本误差很小,训练集和验证集数据来自相同分布,如果没有这些假设作为前提,分析过程更加复杂。
如果稍微改变一下分类器,它会过度拟合部分数据,用紫色线画出的分类器具有高偏差和高方差,偏差高是因为它几乎是一条线性分类器,并未拟合数据。而采用曲线函数或二次元函数会产生高方差,因为它曲线灵活性太高以致拟合了这两个错误样本和中间这些活跃数据。
对于高维数据,有些数据区域偏差高,有些数据区域方差高。在高维数据中采用这种分类器看起来就不会那么牵强了
在训练集上训练算法产生的误差和验证集上验证算法产生的误差来诊断算法是否存在高偏差和高方差,是否两个值都高,或者两个值都不高,根据算法偏差和方差的具体情况决定接下来要做的工作。
1.3 机器学习基础(Basic Recipe for Machine Learning)
在训练神经网络时用到的基本方法:
初始模型训练完成后,首先要知道算法的偏差高不高,如果偏差较高,试着评估训练集或训练数据的性能。如果偏差的确很高,甚至无法拟合训练集,那么要做的就是选择一个新的网络,比如含有更多隐藏层或者隐藏单元的网络,或者花费更多时间来训练网络,或者尝试更先进的优化算法。也可以尝试其他方法,可能有用,也可能没用。
不过采用规模更大的网络通常都会有所帮助,延长训练时间不一定有用,但也没什么坏处。训练学习算法时,不断尝试这些方法,直到解决掉偏差问题,这是最低标准,反复尝试,直到可以拟合数据为止,至少能够拟合训练集。
一旦偏差降低到可以接受的数值,检查一下方差有没有问题,为了评估方差,要查看验证集性能,如果方差高,最好的解决办法就是采用更多数据,但有时候,无法获得更多数据。也可以尝试通过正则化来减少过拟合。总之就是不断重复尝试,直到找到一个低偏差,低方差的框架,这时就成功了。
有两点需要注意:
第一点,高偏差和高方差是两种不同的情况,后续要尝试的方法也可能完全不同, 通常会用训练验证集来诊断算法是否存在偏差或方差问题,然后根据结果选择尝试部分方 法。
第二点,在机器学习的初期阶段,能尝试的方法有很多。可以增加偏差,减少方差,也可以减少偏差,增加方差,但是在深度学习的早期阶段,没有太多工具可以做到只减少偏差或方差却不影响到另一方。但在当前的深度学习和大数据时代,只要正则适度,通常构建一个更大的网络便可以,在不影响方差的同时减少偏差,而采用更多数据通常可以在不过多影响偏差的同时 减少方差。
1.4 正则化(Regularization)
深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据。正则化有助于避免过度 拟合,或者减少网络误差:
在逻辑回归函数中加入正则化:
此方法称为