深度学习入门笔记(九):深度学习数据处理

欢迎关注WX公众号:【程序员管小亮】

专栏——深度学习入门笔记

声明

1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。
2)本文仅供学术交流,非商用。因此每一部分具体的参考资料并无详细对应。若是某部分不当心侵犯了你们的利益,还望海涵,并联系博主删除。
3)博主才疏学浅,文中若有不当之处,请各位指出,共同进步,谢谢。
4)此属于初版本,如有错误,还需继续修正与增删。还望你们多多指点。你们都共享一点点,一块儿为祖国科研的推动添砖加瓦。html

深度学习入门笔记(九):深度学习数据处理

一、训练集,验证集,测试集

在这里插入图片描述
在深度学习的实践中,如何配置 训练验证测试 数据集?比例是怎么样的?哪个数据集应该更多一些?这个过程当中可否作出正确决策,会在很大程度上决定咱们可否建立高效的神经网络。训练神经网络时,须要作出不少决策,例如:程序员

  1. 神经网络分多少层web

  2. 每层含有多少个隐藏单元算法

  3. 学习速率是多少编程

  4. 各层采用哪些激活函数网络

在这里插入图片描述
除了上面说的这些超参数以外,可否建立一个高质量的 训练集验证集测试集 也有助于提升循环的效率。app

这是个什么循环?咱们在 深度学习入门笔记(七):深层神经网络 中说过这个循环,是 Idea—Code—Experiment—Idea 这个大循环,好的数据集能够提升这个过程的循环效率,从而加快实验的进程,更快更好地获得最后的记过。框架

假设整个数据集用一个长方形表示,咱们一般会将这些数据划分红几部分:一部分做为 训练集;一部分做为 简单交叉验证集,有时也称之为 验证集,通常都叫它 验证集(dev set),其实都是同一个概念;最后一部分则做为 测试集机器学习

接下来,咱们开始对 训练集 执行算法,经过 验证集 选择最好的模型,通过充分验证,选定最终模型,而后就能够在 测试集 上进行评估了,为了无偏评估算法的运行情况,选用的测试集应该是没有参与过训练过程的!!!ide

在机器学习发展的小数据量时代,常见作法是 将全部数据三七分,就是人们常说的70%训练集,30%测试集。若是明确设置了 验证集,也能够按照 60%训练集,20%验证集和20%测试集 来划分。这是这些年机器学习领域广泛承认的最好的实践方法。
在这里插入图片描述
若是只有100条,1000条或者1万条数据,那么上述比例划分是很是合理的。可是在大数据时代,如今的数据量多是百万级别,那么 验证集测试集 占数据总量的比例会趋向于变得更小。由于 验证集 的目的就是验证不一样的算法,检验哪一种算法更有效,所以,验证集 只要足够大到能评估不一样的算法,好比2个甚至10个不一样算法,并迅速判断出哪一种算法更有效,不须要拿出20%的数据做为验证集。
在这里插入图片描述
好比如今有100万条数据,那么取1万条数据便足以进行评估便可,找出其中表现最好的1-2种算法。一样地,根据最终选择的分类器,测试集 的主要目的是正确评估分类器的性能,因此,若是拥有百万数据,咱们只须要1000条数据,便足以评估单个分类器,而且准确评估该分类器的性能。

  • 假设咱们有100万条数据,其中1万条做为 验证集,1万条做为 测试集,100万里取1万,比例是1%,即:训练集占98%,验证集和测试集各占1%。
  • 对于数据量过百万的应用,训练集能够占到99.5%,验证和测试集各占0.25%,或者验证集占0.4%,测试集占0.1%。

在这里插入图片描述
总结一下,在机器学习中,咱们一般将样本分红 训练集验证集测试集 三部分,数据集规模相对较小,适用传统的划分比例,数据集规模较大的,验证集测试集 要小于数据总量的20%或10%,具体要怎么作?别着急,后面会给出如何划分验证集和测试集的具体指导。

现代深度学习的另外一个趋势是 愈来愈多的人在训练和测试集分布不匹配的状况下进行训练,假设你要构建一个用户能够上传大量图片的应用程序,目的是找出并呈现全部猫咪图片,可能你的用户都是爱猫人士,训练集多是从网上下载的猫咪图片,而 验证集测试集 是用户在这个应用上上传的猫的图片,就是说,训练集 多是从网络上抓下来的图片,而 验证集测试集 是用户上传的图片。结果许多网页上的猫咪图片分辨率很高,很专业,后期制做精良,而用户上传的照片多是用手机随意拍摄的,像素低,比较模糊,这两类数据有所不一样,针对这种状况,根据经验,建议你们要确保 验证集测试集 的数据来自同一分布,学术说法就是 独立同分布(IID)

定义:独立同分布(iid,independently identically distribution) 在几率统计理论中,指随机过程当中,任什么时候刻的取值都为随机变量,若是这些随机变量服从同一分布,而且互相独立,那么这些随机变量是独立同分布。
在这里插入图片描述
但因为深度学习算法须要 大量的训练数据,为了获取更大规模的训练数据集,咱们能够采用当前流行的各类创意策略,例如,网页抓取,代价就是训练集数据与验证集和测试集数据有可能不是来自同一分布。但只要遵循这个经验法则,你就会发现机器学习算法会变得更快。

最后一点,就算没有测试集也没关系,测试集的目的是对最终所选定的神经网络系统作出无偏估计,若是不须要无偏估计,也能够不设置测试集。因此若是只有 验证集,没有 测试集,咱们要作的就是,在 训练集 上训练,尝试不一样的模型框架,在 验证集 上评估这些模型,而后迭代并选出适用的模型。由于 验证集 中已经涵盖测试集数据,其再也不提供无偏性能评估。固然,若是你不须要无偏估计,那就再好不过了。

在机器学习中,若是只有一个 训练集 和一个 验证集,而没有独立的测试集,遇到这种状况,训练集 还被人们称为 训练集,而 验证集 则被称为 测试集,不过在实际应用中,人们只是把 测试集 当成 简单交叉验证集 使用,并无彻底实现该术语的“验证”功能,由于他们把 验证集 数据过分拟合到了 测试集 中。

若是某团队跟你说他们只设置了一个 训练集 和一个 测试集,你要当心了!!!要想他们是否是真的有 训练验证集,由于他们把 验证集 数据过分拟合到了 测试集 中,让这些团队改变叫法,改称其为 训练验证集,而不是 训练测试集,可能不太容易。即使 训练验证集 在专业用词上更准确。实际上,若是你不须要无偏评估算法性能,那么这样是能够的。

因此说,搭建 训练验证集测试集 可以加速神经网络的集成,也能够更有效地衡量算法地 误差方差,从而帮助咱们更高效地选择合适方法来优化算法。

有的同窗仍是不懂这个数据集都是什么意思,尤为是验证集和测试集,来看一个例子:

  • 训练集——课本;学生学习并根据课本里的内容来掌握知识。
  • 验证集——做业;经过学生完成做业的水平,能够知道学习质量的好坏。
  • 测试集——考试;经过学生考试的结果(考的题是日常都没有见过的),来考察学生触类旁通的能力,也能够知道学习质量的好坏。

例子不是特别严谨,只是提供一种理解的方式!

二、误差,方差

若是你细心的话,就会注意到,几乎全部机器学习从业人员都指望深入理解 误差方差(我也是这样的=-=),这两个概念易学难精,即便你认为已经理解了 误差方差 的基本概念,却总有一些意想不到的新东西出现。关于深度学习的偏差问题,另外一个趋势是对 误差方差 的权衡研究甚浅,你可能据说过这两个概念,但深度学习的偏差不多权衡两者,咱们老是分别考虑 误差方差,却不多放在一块儿。
在这里插入图片描述
如上图,假设这就是数据集,若是想要对这个数据集拟合一条直线,可能获得一个逻辑回归拟合,但它并不能很好地拟合该数据,这是 高误差(high bias) 的状况,咱们称之为 欠拟合(underfitting)

相反的若是咱们拟合一个很是复杂的分类器,好比深度神经网络或含有隐藏单元的神经网络,可能就很是适用于这个数据集,可是这看起来也不是一种很好的拟合方式,即 高方差(high variance) 的状况,咱们称之为 过拟合(overfitting)

在二者之间,可能还有一些像下面三个图的中间图这样的,复杂程度适中,数据拟合适度的分类器,这个数据拟合看起来更加合理,咱们称之为 适度拟合(just right),是介于 过拟合欠拟合 中间的一类。
在这里插入图片描述
在这样一个只有 x 1 x_1 x 2 x_2 两个特征的二维数据集中,咱们能够绘制数据,将 误差方差 可视化。在多维空间数据中,绘制数据和可视化分割边界没法实现,但咱们能够经过几个指标,来研究 误差方差
在这里插入图片描述
仍是沿用猫咪图片分类这个例子(深度学习入门笔记(一):深度学习引言),左边一张是猫咪图片,右边一张不是。理解 误差方差 的两个关键数据是 训练集偏差(Train set error)验证集偏差(Dev set error),为了方便论证,假设咱们能够辨别图片中的小猫,用肉眼识别的结果几乎是不会出错的。

假定 训练集偏差 是1%,为了方便论证,假定 验证集偏差 是11%,能够看出 训练集 设置得很是好,而 验证集 设置相对较差,多是 过分拟合训练集,在某种程度上,验证集 并无充分利用 交叉验证集 的做用,像这种状况,咱们称之为 高方差

经过查看 训练集偏差验证集偏差,咱们即可以诊断算法是否具备 高方差。也就是说衡量 训练集验证集偏差 就能够得出不一样结论。

假设 训练集偏差 是15%,咱们把 训练集偏差 写在首行,验证集偏差 是16%。算法并无在 训练集 中获得很好训练,若是训练数据的拟合度不高,就是数据 欠拟合,就能够说这种算法 误差比较高。相反,它对于 验证集 产生的结果倒是合理的,验证集 中的错误率只比训练集的多了1%,因此这种算法 误差高,由于它甚至不能拟合训练集,这与下图的最左边的图片类似。
在这里插入图片描述
再举一个例子,训练集偏差 是15%,误差至关高,可是,验证集 的评估结果更糟糕,错误率达到30%,在这种状况下,我会认为这种算法 误差高,由于它在 训练集 上结果不理想,并且 方差也很高,这是 方差误差都很糟糕 的状况,不要以为 方差 好像是更高。。。

再看最后一个例子,训练集偏差 是0.5%,验证集偏差 是1%,用户看到这样的结果会很开心,猫咪分类器只有1%的错误率,误差和方差都很低

这些分析都是基于假设预测的,假设人眼辨别的错误率接近0%,通常来讲,最优偏差 也被称为 贝叶斯偏差,因此,最优偏差 接近0%。可是若是 最优偏差贝叶斯偏差 很是高,好比时15%。再看看这个分类器(训练偏差15%,验证偏差16%),15%的错误率对 训练集 来讲也是很是合理的,误差不高方差也很是低

小结一下:要看咱们的最优偏差是多少,才能判断你的 误差方差 !!!
在这里插入图片描述
当全部分类器都不适用时,如何分析 误差方差 呢?好比,图片很模糊,即便是人眼,或者没有系统能够准确无误地识别图片,在这种状况下,最优偏差 会更高,那么分析过程就要作些改变了。

以上分析的前提都是 假设基本偏差很小训练集和验证集数据来自相同分布,若是没有这些假设做为前提,分析过程更加复杂,后面会讨论这个问题的。

有一个疑问出现了,误差方差 都高是什么样子呢?这种状况对于两个衡量标准来讲都是很是糟糕的。

以前讲过,这样的分类器,会产生 高误差误差高 是由于它几乎是一条线性分类器,并未拟合数据,像这种接近线性的分类器,数据拟合度低。
在这里插入图片描述
可是若是稍微改变一下分类器,用紫色笔画出,它会 过分拟合 部分数据。用紫色线画出的分类器具备 高误差高方差误差高 是由于它几乎是一条线性分类器,并未拟合数据;方差高 是由于它灵活性过高以至拟合了这两个错误样本和中间这些活跃数据。
在这里插入图片描述
这看起来有些不天然,从两个维度数据上看,怎么看都不太天然,但对于高维数据,有些数据区域 误差高,有些数据区域 方差高,因此看起来就不会那么牵强了。

总结:拟合地好是最好的,可是过拟合是方差大,欠拟合是误差大,还有一种多是两个差都大!!!

三、机器学习基础

下图就是在训练神经网络用到的基本方法:(尝试这些方法,可能有用,可能没用)

吴恩达老师手稿:
在这里插入图片描述
初始模型训练完成后,首先要知道算法的 误差 高不高,若是 误差较高,试着评估 训练集训练数据 的性能。若是 误差 的确很高,甚至没法拟合训练集,那么要作的就是选择一个新的网络,好比含有更多隐藏层或者隐藏单元的网络,或者花费更多时间来训练网络,或者尝试更先进的优化算法,后面会讲到。训练学习算法时,要不断尝试这些方法,直到解决掉 误差 问题,这是 最低标准,反复尝试,直到能够拟合数据为止,至少可以拟合训练集。固然你也能够尝试其余方法,可能有用,也可能没用。

博主注:训练神经网络时,建议先尽可能过拟合,再经过各类方法解决过拟合的问题,这样的代价更小,成功的可能性更大。

若是网络足够大,一般能够很好地拟合 训练集,实在不行的话,只要你能扩大网络规模,即便图片很模糊,至少能够很好地拟合 训练集,或者 过拟合 训练集。一旦 误差 下降到能够接受的数值,检查一下 方差 有没有问题,为了评估 方差,咱们要查看 验证集 的性能,从一个性能理想的 训练集 推断出 验证集 的性能是否也理想,若是 方差高,最好的解决办法就是采用更多数据,让网络见识到更多的数据类型,拥有更强的拟合泛化能力。若是你能作到这一点,会有必定的帮助,但有时候,没法得到更多数据,咱们也能够尝试经过 正则化 来减小 过拟合,这个下一个笔记会讲。

有同窗抱怨麻烦,无法子,有时候咱们不得不反复尝试这些操做,可是,若是能找到更合适的神经网络框架,有时它可能会一举两得,同时减小 方差误差。如何实现呢?想系统地说出作法很难,总之就是不断重复尝试,直到找到一个 低误差低方差 的框架,这时你就成功了。

有两点须要特别注意:

第一点,高误差高方差 是两种不一样的状况,因此后续要尝试的方法也可能彻底不一样,一般会用 训练验证集 来诊断算法是否存在 误差方差 问题,而后根据结果选择尝试部分方法。举个例子,若是算法存在 高误差 问题,准备更多训练数据其实也没什么用处,至少这不是更有效的方法,因此必定要清楚存在的问题是 误差 仍是 方差,仍是二者都有问题,明确这一点有助于咱们选择出最有效的方法,否则就至关于作无用功,瞎忙乎。

第二点,在机器学习的初期阶段,关于所谓的 误差方差权衡 的讨论家常便饭,缘由是能尝试的方法有不少。能够增长 误差,减小 方差,也能够减小 误差,增长 方差,可是在深度学习的早期阶段,没有太多工具能够作到只减小 误差方差 却不影响到另外一方。然而当前的深度学习和大数据时代,只要持续训练一个更大的网络,只要准备了更多数据,那么也并不是只有这两种状况,简单状况下,只要 正则 适度,一般构建一个更大的网络即可以,在不影响 方差 的同时减小 误差,而采用更多数据一般能够在不过多影响 误差 的同时减小 方差。这两步实际要作的工做是:训练网络,选择网络或者准备更多数据,如今有了一个能够作到在减小 误差方差 的同时,不对另外一方产生过多不良影响的工具。这就是深度学习对监督式学习大有裨益的一个重要缘由,也是不用太过关注如何 平衡误差和方差 的一个重要缘由。

最终,咱们会获得一个很是规范化的网络!!!

补充

正则化,是一种很是实用的减小 方差 的方法,正则化 时会出现 误差方差权衡 问题,误差 可能略有增长,可是若是网络足够大的话,增幅一般不会过高,从而完美地解决 方差大 的问题。

推荐阅读

参考文章

  • 吴恩达——《神经网络和深度学习》视频课程