deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
1. 误差分析(Error analysis)
误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进。NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是1)狗;2)大型猫科动物;3)图像模糊。那么可以建立下面的表格:

在统计过程中发现新的误差源,则添一列(比如这里的Instagram)。本例的结果是100张错误图像中,Blurry占61%,Great Cats占43%,所以这两个是最主要的误差源,那么可以把团队分两拨,一拨人主攻一个方向。而Dog、Instagram的占比就比较小,在这方面努力的效果就不如Great Cats和Blurry明显。
2. Incorrectly labeled examples
只要总数据集足够大,深度学习算法对于训练集中的随机误差(人工标记错误)非常鲁棒。所以对于训练集中的人工标记错误,可以修改一下,也可以放着不管。但对于系统性误差,就不那么鲁棒了。比如如果做标记得人一直把白色的狗标记成猫,那算法会把所有白色的狗都分类为猫。
对于验证集/测试集中的错误标记误差(算法的输出其实是正确的,但由于标记的正确答案是错误的,所以判定算法错误),可以在100张错误图像的统计表格中增加一列统计这个误差的百分比:

如果错误标记误差在整体误差中占比比较小(比如例子中的6%),那么应该集中精力解决其他错误源,这种情况下,验证集/测试集中的错误标记误差也不用管。如果错误标记误差占比比较大(比如达到30%),那么就有必要修正一下错误标记。因为验证集的目的是告诉我们哪一种算法更好,如果错误标记误差占比很大,那对于A算法2.1%的错误率和B算法1.9%的错误率,我们就很难评定到底谁好。
修正错误标记的时候有几个注意点:1)验证集和测试集要同时修正错误标记,目的是保证两者同分布。2)不但要检查由于错误标记而把算法对的结果误判成错的,也要检查把算法错的结果误判为对的。这一条通常不做,因为样本太多不容易做,比如错误率为2%,误判错只需要在2%的样本里查看,而误判对则要在98%的样本里查看。3)由于我们修正了验证集/测试集中的错误标记,对于训练集没有这样做(因为训练集实在太大了),所以会导致训练集和验证集/测试集的分布轻微不同。验证集/测试集同分布非常重要,训练集可以轻微不同。
NG表示花几十分钟、几个小时手工统计一下100个或者几百个错误样本是非常值得的,这真的可以帮助我们找到需要优先处理的任务。
3. 尽快建立第一个原型系统,然后快速迭代
NG建议的步骤:1)建立验证集/测试集,以及单一实数评估指标,这一步是设立目标;2)尽快搭一个原型系统(quick and dirty),用训练集训练一下,看效果;3)用偏差/方差分析和误差分析来决定下一步优先努力调整的方向。
这套方法对于没有先验经验的问题非常适用,不要想太多,一开始就把系统弄得太复杂。对于有很多先验经验的问题,比如人脸识别,那么可以从现有的大量学术文献为基础开始,一开始就搭建比较复杂的系统。
4. 训练集和验证集/测试集不同分布
由于人们需要喂给深度学习算法大量的训练数据,所以训练集和验证集/测试集分布不同是很正常的。
比如我们开发一个app识别猫,用户上传的图片是模糊的不专业的,大概2万个样本,这是我们真正关心的数据集,所以验证集/测试集都必须从这个数据集里取。这点样本对于训练神经网络远远不够,所以我们又从网上爬了20万图片过来,这个数据集的分布是和我们真正关心的数据集不同的。可以把20万网络样本作为训练集,1万用户样本作为验证集,1万用户样本作为测试集;或者20万网路样本和1万用户样本合起来作为21万样本的训练集,5000用户样本作为验证集,5000用户样本作为测试集。
为了区分泛化误差和由于分布不同而导致的误差,要设立一个新的数据子集:train-dev set(训练验证集),这个数据子集里的数据全部来自训练集。这时候我们的数据集被分为4部分:训练集、训练验证集、验证集、测试集。有5个误差需要比较:
a)Human level,近似Bayes optimal error;
b)训练集误差;
c)训练测试集误差;
d)验证集误差;
e)测试集误差。
a和b之间的距离是avoidable bias,描述算法是否欠拟合;b和c之间的是variance,描述算法的泛化能力,是否过拟合;c和d之间是data mismatch,描述训练集和验证集/测试集分布的不同;d和e之间是验证集(或者叫开发集)过拟合的程度,如果这个值很大,那么就需要增加验证集的大小。
如何缓解训练集和验证集/测试集分布不同带来的data mismatch的问题呢?NG有两个建议:1)人工分析误差,看看到底分布差别在什么地方,比如是不是训练集图片不够模糊;2)尝试让训练集的数据更靠近验证集/测试集,比如把训练集的图片弄模糊一点,或者干脆采集更多类似验证集/测试集的数据用来训练。对于第二个建议,有专门的术语来描述数据合成:Artificial data synthesis,目的就是生成更接近验证集/测试集的训练数据。人工数据合成会有一个潜在的问题:过拟合,这是由于只合成了样本空间的一小部分。
5. 迁移学习(Transfer learning)
从任务A中学习的知识可以应用到另一个独立的任务B中。一般做法是把A算法的最后的输出层换成重新赋予随机权重的网络(一层或者几层 ,这取决于B的样本的多少),然后让它在任务B上训练。如果B的样本很少,那么可能只需要训练最后一层(或者最后两层)的权重;如果B的样本很多,也可以重新训练所有层的权重,这种情况下,训练A的过程被称为“预训练(pre-training)”,训练B的过程被称为“微调(fine tune)”。两个例子,一是用图像识别的算法迁移学习X射线图像的诊断,二是语音识别的算法迁移学习唤醒词。
什么情况下迁移学习的效果比较好呢?1)任务A和B有相同的输入,比如都是图像、都是音频等。2)任务A比任务B有大得多的训练集,由于B的每一条数据比A重要得多,所以A的数据量的大得多才有帮助。3)任务A的低层次特征对任务B有帮助,比如一般图像识别算法的低层次特征有助于理解图像,所以可以迁移到识别X射线扫描图的任务中。
6. 多任务学习
迁移学习是串行的训练网络,先A,再B。多任务学习是让单个神经网络同时做几件事情,然后希望每个任务都能帮到其他所有任务。例如在研发无人驾驶车辆,无人车需要同时检测不同的物体:行人、车辆、停车标志、交通灯。这时候对于输入X(i),就不是一个标签,而是四个标签组成的4*1的向量y(i),对于所有样本来说,标签矩阵Y = [y(1), y(2), ... , y(m)],loss funciton是和Y的所有元素相关的量。这和softmax多类别分类的差别在于,softmax是把单个标签分给单个样本,而这里一张图片可以有多个标签。
什么情况下多任务学习的效果比较好呢?1)多个任务有可以共用的低层次特征;2)不同任务的数据量很接近,这一条是经验,并没有严格论证。3)有能力训练一个足够大的神经网络可以同时做好多个任务,Rich Carona发现相比于训练单任务神经网络,多任务神经网络会降低性能的唯一情况是网络还不够大,只要网络足够大,肯定不会或者很少会降低性能。
在实践中,多任务学习用的比迁移学习少得多。NG说他看到很多迁移学习的应用(针对数据量少的任务),但很少看到多任务学习的应用。多任务学习的应用主要是计算机视觉中的物体检测。
7. 端到端深度学习
端到端是指无视中间环节,只关注输入和输出的映射关系。端到端深度学习的挑战之一是需要大量的数据。对于没有大量端到端的数据的应用场合,则往往会把问题拆分成几个小问题,这样做有两个好处,1)子问题更容易解决;2)子问题有大量数据可以训练。比如计算机视觉的门禁系统,会先提取人的脸,再做人脸识别,而不是直接拿原始图片做人脸识别。
端到端深度学习的优点:
1)数据说了算。不会引入人为的偏见。
2)更不需要人工设计组件。
缺点:
1)需要大量数据。
2)也排除了有益的人工设计组件。NG说学习算法有两大知识来源,一是数据,另一个是人工设计的组件。当数据非常多时,人工设计的东西就不太重要了,但是当没有太多数据的时候,构造一个精心设计的系统实际上可以将人类对这个问题的认识直接注入到系统里。
所以关键中的关键就是是否有足够的数据让系统学习到足够复杂的映射关系。
deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II的更多相关文章
- deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II 听课笔记
1. 误差分析(Error analysis) 误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进.NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是 ...
- deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I 听课笔记
这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训. 1. 正交化(Othogonalization) 设计机器学习系统时需要面对一个问题是:可以尝试 ...
- deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训. 1. 正交化(Othogonalization) 设计机器学习系统时需要面对一个问题是:可以尝试 ...
- 使用 TensorFlow 构建机器学习项目中文版·翻译完成
原文:Building Machine Learning Projects with TensorFlow 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原 ...
- 使用Google Cloud Platform构建机器学习项目-宠物识别
宠物识别我们使用到了tensorflow object-detection API (https://github.com/tensorflow/models/tree/master/researc ...
- DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)
一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...
- Coursera机器学习+deeplearning.ai+斯坦福CS231n
日志 20170410 Coursera机器学习 2017.11.28 update deeplearning 台大的机器学习课程:台湾大学林轩田和李宏毅机器学习课程 Coursera机器学习 Wee ...
- Deep Learning.ai学习笔记_第三门课_结构化机器学习项目
目录 第一周 机器学习策略(1) 第二周 机器学习策略(2) 目标:学习一些机器学习优化改进策略,使得搭建的学习模型能够朝着最有希望的方向前进. 第一周 机器学习策略(1) 搭建机器学习系统的挑战:尝 ...
- 28款GitHub最流行的开源机器学习项目,推荐GitHub上10 个开源深度学习框架
20 个顶尖的 Python 机器学习开源项目 机器学习 2015-06-08 22:44:30 发布 您的评价: 0.0 收藏 1收藏 我们在Github上的贡献者和提交者之中检查了用Python语 ...
随机推荐
- vi粘贴代码后格式混乱的问题
最近在远程终端使用vi发现从其他地方复制代码的后,粘贴到vi里面出现格式变乱的问题. 主要是因为终端通常无法区分输入是来自用户输入还是来自粘贴,所以终端也不能通知 vim 输入来自何处.在 vim 里 ...
- Vue.js——5.生命周期
Vue的生命周期 创建阶段new Vue1,beforeCreate() 表示在实例没有被创建出来之前会执行它加载data和methods2,caeated() data 和methods被初始化了 ...
- 18 11 07 pygame 继续使用
---恢复内容开始--- 1 给原来的游戏不定时 增加一些敌机 用到了pygame的定时器 定时器就是每隔一段时间 就进行一次相同的操作 2 pyagame 在捕获键盘操作有两种 1 ...
- 推荐Markdown编辑器——Inspire
推荐Markdown编辑器--Inspire Inspire是一款非常好用的编辑器,支持Markdown语法,当然,Inspire还有一些自己的语法. 本文就是在这款编辑器下编写的. 风格 像Visu ...
- 使用git submodule
git submodule 引用 $ git help submodule $ git submodule add https://github.com/aditya-grover/node2vec. ...
- 17.3.12--uillib模块
1---uillib是python标准库中最常用的一个python网络应用资源访问的模块,他可以让你像访问文本一样,读取网页的内容 它的作用是访问一些不需要验证的网络资源和cookie等 uillib ...
- mybatis 在自动生成时设置不生成Example类
只需要在配置要生成的table表中添加几个配置属性就行了. 在generatorConfig.xml文件中修改 <!--指定数据库表--> <table tableName=&quo ...
- PAT Advanced 1020 Tree Traversals (25) [⼆叉树的遍历,后序中序转层序]
题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder an ...
- CCPC2019网络赛
2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 A 题意:找到最小的正整数 C 使得 (A^C)&(B^C) 最小. \(A,B \le 10^9\) 签到题.这个C取 A& ...
- [HNOI2019]白兔之舞(矩阵快速幂+单位根反演)
非常抱歉,这篇文章鸽了.真的没时间写了. #include<bits/stdc++.h> using namespace std; typedef long long ll; #defin ...