吴恩达深度学习deeplearning.ai学习笔记(二)1.1 1.2 1.3

1.1 训练_开发_测试集

训练神经网络时,要做的决策很多:

\#layers,\#hidden\ units,learning\ rate,activation\ function

最佳决策取决于很多因素:你所拥有的数据量、计算机配置中输入特征的数量、用GPU还是CPU训练、具体配置……不可能一开始就预设出最匹配的超参数,循环“Idea-Code-Experiment”这过程的效率是决定项目进展速度的一个关键因素,而创建高质量的训练数据集、开发集、测试集也有助于提高循环效率;

数据集被分为哪三个部分?有什么作用?比例是多少?

(1)training\ set 训练集

(2)Development\ set/Hold-out\ cross\ validation\ set 验证集,也叫简单交叉验证集。由于中文翻译习惯不同,把“development set”叫验证集或者开发集都是可以的,简写为dev set;

(3)test\ set 测试集

开发集是用于选择最好的模型的,经过充分验证选定模型后才在测试集上进行评估,一般是无偏估计算法的运行情况;牢记开发集的目的就是验证不同的算法哪种更加有效,因此,验证集往往要足够大才能验证比如2个或10个算法,迅速判断哪个更有效;牢记测试集的目的是对最终选定的神经网络系统进行无偏评估

早期数据量较小时,比如只有100~10000数量级的数据,训练集、开发集、测试集的比例一般是70/30/0或60/20/20两种,测试集甚至是非必要的,假如不需要无偏评估的话;

在如今大数据时代,数据量早已到达十万、百万甚至多达上亿级别,拥有这种数量级别的数据,训练集、开发集、测试集的比例已经趋向于让验证集合测试集占数据总量更小的比例;比如:当我们有100万条数据时,我们可能只需要各拿1万条数据分给验证集和测试集,此时的比例就是98/1/1;如果数据量更多,这个比例甚至能达到99.5/0.25/0.25或99.5/0.4/0.1;

深度学习的另一个趋势是在训练集和测试集分布不匹配的情况下进行训练;

例如你想构建一个爱猫人士可以上传大量图片的应用程序,目的是想找出并呈现所有猫的图片;那么你的训练集可能是从网上下载的猫咪图片,这些图片可能分辨率高、专业、后期制作精良;而你的测试集则会选择用户上传的图片,后面会讲到原因,剧透一下测试集+衡量指标就是定下你要瞄准的靶子,用户上传的图片就是我们要瞄准的靶子,分辨出它们就是我们的目的,用户上传的图片可能是模糊、业余、随意拍摄的;所以两类数据集的分布可能不同,然而,只要我们遵守一条经验法则就可以大大降低影响:

确保验证集和测试集的数据来自同一分布;

深度学习需要大规模的训练数据,我们可以采用网页抓取等目前流行的创意策略,即使会导致训练集和其他二者的分布不同,但遵守上面的法则,算法就能变得很快;

1.2 偏差_方差

这两个东西易学难精,总有一些新的东西出现,对二者权衡的研究也较浅;

在这样一个只有x_1x_2两个特征的二维数据集中,我们能将它们画在二维坐标面中直观地将偏差与方差可视化;图中的圆点和叉点分别是两类数据点,比如圆点是有猫的数据,而叉点是无猫的数据,我们所要做的就是训练出一个分类器,将两类数据区别开来,也就是图中所画的蓝线;

(1)如果像左图给这个数据集仅仅拟合一条直线作为分类器,可能得到一个逻辑回归的拟合,但却不能很好地拟合该数据集,比如直线左下方应该是圆点类数据,但掺杂了很多叉点,这种情况分类器比较“简单”,我们称它为偏差高(high\ bias)的情况,对应“欠拟合”(underfitting)以及“训练数据表现不好”(training\ data\ performance\ is\ bad)

(2)如果我们像右图这样拟合一条很复杂的曲线作为分类器,比如用深层神经网络,可能确实非常适合此数据集,但在应用到其他数据集时,它的效果就很差了,我们称它为方差高(high\ variance)的情况,对应“过拟合(overfitting)”、“缺乏泛化能力”(lack\ generliazation\ ability)以及“开发集表现不好”(dev\ set\ performance\ is\ bad)

(3)如果我们能在欠拟合和过拟合之间找到合适的一种分类器,其复杂程度适中,数据拟合效果很好的同时拥有强大的泛化能力,那么就会像居中的图那样拟合出一条不错的曲线,我们将它称为“适度拟合”(just\ right)

但是在多维空间数据中,比如输入特征超过了三个,我们就不仅无法绘制数据,也无法实现可视化分割边界;但我们可以通过几个指标来研究方差和偏差,这里提前剧透一下后面的内容:

Human\ level\ error\ \approx\ Bayes\ error 人类水平错误率≈贝叶斯最优错误率

Training\ set\ error 训练集错误率

Training-dev\ set\ error 训练-开发集错误率

Dev\ set\ error 开发集错误率

Test\ set\ error 测试集错误率

例子:猫分类器的偏差、方差分析

首先假设人类在分类猫这件事上几乎做到完美,Human\ level\ error\ \approx\ 0\%,并且只讨论训练集错误率和开发集错误率:

(1)如果训练集错误率和开发集错误率直接差距很大,这意味着开发集很可能对训练集过拟合了,是高方差这一类问题;

(2)如果训练集错误率和人类水平错误率差距很大,这意味着最基本的训练集拟合效果都不好,是高偏差这一类问题;

(3)如果同时存在高方差和高偏差的问题,那么就可能像下图中紫色线所示,它对两个样本进行了过拟合,曲线复杂,具有高偏差;而本身接近线性分类器,拟合效果差,具有高偏差:

高维数据中有些数据区域方差高,有些则偏差高,采用这类分类器可能就没有那么牵强;

值得注意的是,以上的讨论都是基于两大前提下的:人类水平错误率≈0、训练集和验证集来自于同一分布;如果不满足,对方差和偏差的讨论会更加的复杂;

1.3 机器学习基础

针对偏差高、方差高这两类情况,分别有两类系统性的方法去调整改进系统;

当我们的初始模型训练完成以后,首先应该看看算法的偏差高不高,一般是先调整高偏差,即让模型能在训练集上取得良好拟合效果以后,再来调整高方差问题,也就是解决模型对训练集的过拟合问题,前者可能只需要在训练集上训练得到训练集错误率,后者则还要更近一步在开发集上应用;

如果偏差很高,那么可以采取以下方法:

(1)尝试用更大的网络,比如增加网络层数(即深度),增加网络某些层或所有层的隐藏单元数,通常是有效的,这里打个岔,大家有兴趣可以看看宽度学习,其实就是增加“特征节点和增强节点的数量”

(2)尝试用更长的时间训练网络,但不一定有效;

(3)尝试使用更加优秀的优化算法,这一点老吴漏了,但第二、三章有讲;

(4)尝试不同的神经网络架构,但不一定有效;

反复尝试上述四种方法直到解决偏差问题,这是最低标准,我们至少得能拟合训练集;

在偏差下降到可接受范围以后,我们就需要检查方差高不高,而评估方差的方法就是把算法应用在开发集上,看看开发集的效果如何,性能如何,如果开发集错误率和训练集错误率差距很大,说明存在高方差问题,这时可以采取以下方法:

(1)尝试收集更多数据来增大训练集的数据量,通常是有效的;

(2)尝试正则化,通常是有效的;

(3)尝试不同的神经网络架构,但不一定有效;

有时会出现调整方差时影响了偏差,所以要做的就是多尝试,直到实现低偏差、低方差;

有关于偏差和方差的权衡(Bias\ variance\ trade\ off)的讨论一直存在,早期缺乏太多能做到影响一方而不影响另一方的工具,而现在只要持续训练一个更大的网络就能在不影响方差的同时减少偏差,而采用更大的训练集能在不影响偏差的同时减小方差,但二者都要建立在接受训练时间增加的代价以及规范化神经网络的基础上;

这就是为何深度学习对监督式学习大有裨益的原因,也是我们不用太过关注如何权衡偏差和方差的一个重要原因。

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值