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 1 机器学习策略 I 听课笔记
这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训. 1. 正交化(Othogonalization) 设计机器学习系统时需要面对一个问题是:可以尝试 ...
- deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
1. 误差分析(Error analysis) 误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进.NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是 ...
- deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训. 1. 正交化(Othogonalization) 设计机器学习系统时需要面对一个问题是:可以尝试 ...
- deeplearning.ai 神经网络和深度学习 week3 浅层神经网络 听课笔记
1. 第i层网络 Z[i] = W[i]A[i-1] + B[i],A[i] = f[i](Z[i]). 其中, W[i]形状是n[i]*n[i-1],n[i]是第i层神经元的数量: A[i-1]是第 ...
- deeplearning.ai 神经网络和深度学习 week1 深度学习概论 听课笔记
1. 预测房价.广告点击率:典型的神经网络,standard NN. 图像:卷积神经网络,CNN. 一维序列数据,如音频,翻译:循环神经网络,RNN. 无人驾驶,涉及到图像.雷达等更多的数据类型:混合 ...
- 使用 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课程学习(1)
本系列主要是我对吴恩达的deeplearning.ai课程的理解和记录,完整的课程笔记已经有很多了,因此只记录我认为重要的东西和自己的一些理解. 第一门课 神经网络和深度学习(Neural Netwo ...
- DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)
一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...
随机推荐
- Bootstrap学习笔记(二)---常见工具和流程导航范例
使用bootstrap框架避免不了写CSS,当CSS文件较大时,会发现维护起来很麻烦,一些默认值,如行高.背景色.标注颜色.字号等信息往往反复出现,还有一些大体上一致,只有小部分不同的样式定义,这就需 ...
- app支付宝快速入门
最近在做个车辆认证app,需要用到支付宝付款.前端使用H5,框架是react,后台是java.app支付与普通网页支付差别还是很大,我这里主要对于app支付做说明 1.让财务开通支付宝账号(需要企业税 ...
- 《设计模式:可复用面向对象软件的基础》【PDF】下载
<设计模式:可复用面向对象软件的基础>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382288 内容介绍 <设计模式:可复 ...
- mongodb命令行基础语法
首先是安装并配置mongodb,这个请自行百度,安装完成后打开cmd命令输入mongo.我们现在先做一个例子吧,假设有一个班级叫c1,里面有若干个人,里面的人有姓名.年龄.性别和班级,我们分别对他们进 ...
- 深谈auto变量
1.c++中有一个关键字auto,c语言也有这么一个关键字,但是两者的意义大不相同. 2.c++中用auto定义的变量自动匹配赋值号右边的值的类型,具有自动匹配类型的作用,而c语言中auto只是声明一 ...
- Java编程学习知识点分享 入门必看
Java编程学习知识点分享 入门必看 阿尔法颜色组成(alpha color component):颜色组成用来描述颜色的透明度或不透明度.阿尔法组成越高,颜色越不透明. API:应用编程接口.针对软 ...
- python爬虫——建立IP池,将可用IP存放到redis
直接上代码,每行代码后面都有注释 import urllib.request import urllib import re import time import random import sock ...
- springBoot系列教程04:mybatis及druid数据源的集成及查询缓存的使用
首先说下查询缓存:查询缓存就是相同的数据库查询请求在设定的时间间隔内仅查询一次数据库并保存到redis中,后续的请求只要在时间间隔内都直接从redis中获取,不再查询数据库,提高查询效率,降低服务器负 ...
- 如何将外部的obj模型导入OpenGL
1.关于obj的说明. obj中存放的是顶点坐标信息(v),面的信息(f),法线(vn),纹理坐标(vt),以及材质(这个放在mtl)中 我使用CINEMA 4D导出用VS查看后的信息: CINEMA ...
- jq选择器汇总
$("div") //标签 $(".box") //类 $("#box") //ID $("a[href][name]" ...