博客园 首页 私信博主 显示目录 隐藏目录 管理 凤⭐尘

吴恩达《深度学习》-第三门课 结构化机器学习项目(Structuring Machine Learning Projects)-第二周:机器学习策略(2)(ML Strategy (2)) -课程笔记

第二周:机器学习策略(2)(ML Strategy (2))

2.1 进行误差分析(Carrying out error analysis)

进行错误分析,应该找一组错误样本,可能在你的开发集里或者测试集里,观察错误标记的样本,看看假阳性(false positives)和假阴性(false negatives),统计属于不同错误类型的错误数量。在这个过程中,可能会得到启发,归纳出新的错误类型, 就像:如果你过了一遍错误样本,然后说,天,有这么多 Instagram 滤镜或 Snapchat 滤镜,这些滤镜干扰了我的分类器,你就可以在途中新建一个错误类型。总之,通过统计不同错误标记类型占总数的百分比,可以帮你发现哪些问题需要优先解决,或者给你构思新优化方向的灵感。

2.2 清除标注错误的数据(Cleaning up Incorrectly labeled data)

在构造实际系统时,通常需要更多的人工错误分析,更多的人类见解来架构这些系统

考虑训练集,事实证明,深度学习算法对于训练集中的随机错误是相当健壮的(robust)。只要你的标记出错的样本离随机错误不太远,如果错误足够随机,那么放着这些错误不管可能也没问题,而不要花太多时间修复它们。

亲自检查数据非常值得,因为花了这几分钟,或者几个小时去亲自统计数据,真的可以帮你找到需要优先处理的任务,可以确定应该优先尝试哪些想法,或者哪些方向。

2.3 快速搭建你的第一个系统,并进行迭代(Build your first system quickly, then iterate)

建议快速建立第一个系统,然后迭代。不过如果你在这个应用程序领域有很多经验,这个建议适用程度要低一些。还有一种情况适应程度更低,当这个领域有很多可以借鉴的学术文献,处理的问题和你要解决的几乎完全相同,比如说, 人脸识别就有很多学术文献,如果你尝试搭建一个人脸识别设备,那么可以从现有大量学术文献为基础出发,一开始就搭建比较复杂的系统。但如果你第一次处理某个新问题,那真的不鼓励你想太多,或者把第一个系统弄得太复杂。建议构建一些快速而粗糙的实现, 然后用来帮你找到改善系统要优先处理的方向。

2.4 使用来自不同分布的数据进行训练和测试(Training and testing on different distributions)

一种选择,是将两组数据合并在一起,这样你就有 21 万张照片,你可以把这 21 万张照片随机分配到训练、开发和测试集中。

好处在于,你的训练集、开发集和测试集都来自同一分布,这样更好管理。

但坏处在于,测试集 2500 个样本其中很多图片都来自网页下载的图片,那并不是你真正关心的数据分布,平均而言,只有 119 张图来自手机上传。

建议另外一条路,训练集,比如说还是 205,000 张图片,我们的训练集是来自网页下载的 200,000 张图片,然后如果需要的话,再加上 5000 张来自手机上传的图片。训练集包含了来自网页的 20 万张图片,还有 5000 张来自应用的图片,开发集就 是 2500 张来自应用的图片,测试集也是 2500 张来自应用的图片。

这样将数据分成训练集、 开发集和测试集的好处在于,现在你瞄准的目标就是你想要处理的目标。

2.5 数据分布不匹配时的偏差与方差的分析(Bias and Variance with mismatched data distributions)

当你的训练集来自和开发集、测试集不同分布时,分析偏差和方差的方式可能不一样:

首先算法只见过训练集数据,没见过开发集数据。第二,开发集数据来自不同的分布。因为你同时改变了两件事情,很难确认这增加的 9%误差率有多少是因为算法没看到开发集中的数据导致的,这是问题方差的部分,有多少是因为开发集数据就是不一样。

为了分辨清楚两个因素的影响,定义一组新的数据是有意义的,我们称之为训练-开发集:

为了进行误差分析,你应该做的是看看分类器在训练集上的误差,训练 -开发集上的误差,还有开发集上的误差:

我们来看一个不同的样本,假设训练误差为 1%,训练-开发误差为 1.5%,但当你开始处理开发集时,错误率上升到 10%。现在你的方差问题就很小了,因为当你从见过的训练数据 转到训练-开发集数据,神经网络还没有看到的数据,错误率只上升了一点点。但当你转到开发集时,错误率就大大上升了,所以这是数据不匹配的问题。因为你的学习算法没有直接 在训练-开发集或者开发集训练过,但是这两个数据集来自不同的分布。但不管算法在学习什么,它在训练-开发集上做的很好,但开发集上做的不好,所以总之你的算法擅长处理和你关心的数据不同的分布,我们称之为数据不匹配的问题。

训练误差是 10%,训练-开发误差是 11%,开发误差为 12%, 要记住,人类水平对贝叶斯错误率的估计大概是 0%,如果你得到了这种等级的表现,那就真的存在偏差问题了。存在可避免偏差问题,因为算法做的比人类水平差很多,所以这里的偏差真的很高。

最后一个例子,如果你的训练集错误率是 10%,你的训练-开发错误率是 11%,开发错 误率是 20%,那么这其实有两个问题。第一,可避免偏差相当高,因为你在训练集上都没有 做得很好,而人类能做到接近 0%错误率,但你的算法在训练集上错误率为 10%。这里方差 似乎很小,但数据不匹配问题很大。所以对于这个样本,我说,如果你有很大的偏差或者可 避免偏差问题,还有数据不匹配问题。

这两个数字之间的差异(Human level 4%和 Training error 7%),还有这两个数字之间(Training error 7%和 Training-dev error 10%),这两个数 字之间(Training-dev error 10%和 Dev/Test dev 6%)。这个差距(Human level 4%和 Training error 7%)衡量了可避免偏差大小,这个差距 Training error 7%和 Training-dev error 10%)衡 量了方差大小,而这个差距(Training-dev error 10%和 Dev/Test dev 6%)衡量了数据不匹配问题的大小。

事实证明,把剩下的两个数字(rearview mirror speech data 6%和 Error on examples trained on 6%),也放到这个表格里也是有用的。如果结果这也是 6%,那么你获得这个数字 的方式是你让一些人自己标记他们的后视镜语音识别数据,看看人类在这个任务里能做多 好,也许结果也是 6%。那就是说你已经在后视镜语音数据上达到人类水平了,所以也许你对那个数据分布做的已经 不错了。

当你继续进行更多分析时,分析并不一定会给你指明一条前进道路,但有时候你可能洞 察到一些特征。比如比较这两个数字(General speech recognition Human level 4%和 rearview mirror speech data 6%),告诉我们对于人类来说,后视镜的语音数据实际上比一般语音识 别更难,因为人类都有 6%的错误,而不是 4%的错误,但看看这个差值,你就可以了解到偏差和方差,还有数据不匹配这些问题的不同程度。

2.6 处理数据不匹配问题(Addressing data mismatch)

总而言之,如果你认为存在数据不匹配问题,建议你做错误分析,或者看看训练集,或者看看开发集,试图找出,试图了解这两个数据分布到底有什么不同,然后看看是否有办法收集更多看起来像开发集的数据作训练。

其中一种办法是人工数据合成,人工数据合成确实有效。在语音识别中。我已经看到人工数据合成显著提升了已经非常好的语音识别系统的表现,所以这是可行的。但当你使用人工数据合成时,一定要谨慎,要记住你有可能从所有可能性的空间只选了很小一部分去模拟数据,并且这样做很可能出现过拟合现象。

2.7 迁移学习(Transfer learning)

有的时候神经网络可以从一个任务中习得知识, 并将这些知识应用到另一个独立的任务中。

你从数据量很多的问题迁移到数据量相对小的问题。反过来的话,迁移学习可能就没有意义了。迁移学习可能不会有害,但也别指望这么做可以带来有意义的增益。

总结一下,什么时候迁移学习是有意义的?如果你想从任务𝐴学习并迁移一些知识到任务𝐵,那么当任务𝐴和任务𝐵都有同样的输入𝑥时,迁移学习是有意义的。例如:𝐴和𝐵的输入都是图像,or,两者输入都是音频。当任务𝐴的数据比任务𝐵 多得多时,迁移学习意义更大。所有这些假设的前提都是,你希望提高任务𝐵的性能,因为任务𝐵每个数据更有价值,对任务𝐵来说通常任务𝐴的数据量必须大得多,才有帮助,因为任务𝐴里单个样本的价值没有比任务𝐵单个样本价值大。然后如果你觉得任务𝐴的低层次特征, 可以帮助任务𝐵的学习,那迁移学习更有意义一些。

2.8 多任务学习(Multi-task learning)

整个训练集的平均损失和之前分类猫的例子主要区别在于,现在你要对𝑗 = 1到4求和, 这与 softmax 回归的主要区别在于,与 softmax 回归不同,softmax 将单个标签分配给单个样本。

当三件事为真时,多任务学习就是有意义的:

如果想要从多任务学习得到很大性能提升,那么其他任务加起来必须要有比单个任务大得多的数据量。要满足这个条件,其中一种方法是,比如这个例子这样,或者如果每个任务中的数据量很相近,但关键在于,如果对于单个任务你已经有 1000 个样本了,那么对于所有其他任务,你最好有超过 1000 个样本,这样其他任务的知识才能帮你改善这个任务的性能。

你可以训练一个足够大的神经网络,那么多任务学习肯定不会或者很少会降低性能,我们都希望它可以提升性能,比单独训练神经网络来单独完成各个任务性能要更好。在实践中,多任务学习的使用频率要低于迁移学习。

总结一下,多任务学习能让你训练一个神经网络来执行许多任务,这可以给你更高的性能,比单独完成各个任务更高的性能。但要注意,实际上迁移学习比多任务学习使用频率更高。

2.9 什么是端到端的深度学习?(What is end-to-end deep learning?)

简而言之,以前有一些数据处理系统或者学习系统,它们需要多个阶段的处理。 那么端到端深度学习就是忽略所有这些不同的阶段,用单个神经网络代替它。

对于人脸检测,迄今为止最好的方法似乎是一个多步方法:

实际上,把这个分成两个子问题,比纯粹的端到端深度学习方法,达到更好的表现。不 过如果你有足够多的数据来做端到端学习,也许端到端方法效果更好。但在今天的实践中, 并不是最好的方法。

所以端到端深度学习系统是可行的,它表现可以很好,也可以简化系统架构,让你不需要搭建那么多手工设计的单独组件,但它也不是灵丹妙药,并不是每次都能成功。

2.10 是否要使用端到端的深度学习?(Whether to use endto-end learning?)

端到端的深度学习,有时候效果拔群。但你也要注意应该在什么时候使用端到端深度学习:

端到端深度学习的弊端之一是它把可能有用的人工设计的组件排除在外了,精心设计的人工组件可能非常有用,但它们也有可能真的伤害到你的算法表现。例如,强制你的算 法以音位为单位思考,也许让算法自己找到更好的表示方法更好。所以这是一把双刃剑,可 能有坏处,可能有好处,但往往好处更多,手工设计的组件往往在训练集更小的时候帮助更 大。

在构建一个新的机器学习系统,尝试决定是否使用端到端深度学习,关键的问题是,有足够的数据能够直接学到从𝑥映射到𝑦足够复杂的函数吗?还没有正式定义过这个词“必要复杂度(complexity needed)”。但直觉上,如果你想从𝑥到𝑦的数据学习出一个函数,就是看着这样的图像识别出图像中所有骨头的位置,那么也许这像是识别图中骨头这样相对简单的问题,也许系统不需要那么多数据来学会处理这个任务。直接去找这种函数,直觉上似乎是更为复杂的问题。如果你用纯端到端方法, 需要很多数据去学习。

posted @ 2020-01-05 22:08  凤☆尘  阅读(209)  评论(0编辑  收藏  举报