deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I 听课笔记
这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训。
1. 正交化(Othogonalization)
设计机器学习系统时需要面对一个问题是:可以尝试和改变的东西太多太多了。牛逼的机器学习专家很清楚自己要调什么以达到什么目的,这个调参和效果一一对应的关系就是所谓的正交化,调整一个参数的时候,只调整一个对应的性质。或者说各种性质互相正交,互不影响。
机器学习的一般性步骤:
1)在训练集上表现足够好,如果不够好的话,则尝试更大的神经网络、用更好的优化算法比如Adam等。
2)在验证集上表现足够好,如果不够好的话,则尝试正则化、增大训练集等。
3)在测试集上表现足够好,如果不够好的话,则尝试更大的验证集等。
4)在实际中表现足够好,如果不好好的话,则尝试改变验证集、改变cost function等。
NG说他不会用提前停止(early stopping)的方法。因为它同时影响了1)和2)。
2. 评价机器学习系统好坏的指标
NG建议用机器学习解决实际问题的时候,设置一个单一的实数来评价机器学习系统的好坏,这会加快调参,因为它可以很快的告诉我们系统变好还是变坏。
常用的评估机器学习系统的指标是Precision(查准率)和Recall(查全率)。比如在训练集一大堆图片中识别猫,Precision是给一张图片系统判定是不是猫的正确率,而Recall是机器学习系统把训练集中所有猫认出来的百分比。在实际使用中,这两个指标往往需要做权衡,一个变好,往往另一个变坏,所以NG不推荐使用这种指标。我们需要一个单一的实数来告诉我们系统时好还是坏,很直接简单,不需要权衡。一种常用的选择是F1 Score = 2/(1/P+1/R),可以看成是Precision(P)和Recall(R)的平均值,数学定义是Harmonic mean。
所以我们实际评估系统好坏的时候,可以选一个验证集,外加一个单一实数指标,来快速判断哪个系统更好。这可以加速改进机器学习算法的迭代过程。
单一实数指标的选择要跟据实际情况来,如果几个指标物理意义相似,比如一个算法在世界不同地区的表现,则可以简单的取平均值。如果几个指标有不同的物理意义,比如accuracy和running time,则我们往往会选择一个指标作为优化指标,即希望它越小越好(或者越大越好),而其他指标作为满足指标,即只需要达到一个阈值就可以了,比如running time要小于100ms,不在乎它是70ms还是90ms。
3. 如何设置验证集(课程里也叫开发集development set)/测试集
验证集和测试集要尽量同分布。可以把 数据随机洗牌,然后分配验证集和测试集。
传统的机器学习算法习惯于按70%/30%的比例分配训练集/测试集,或者60%/20%/20%分配训练集/验证集/测试集。这种分法对于小样本(几百、几千、上万)的情况是很合理的。但对于现代的大样本(上百万)应用,98%/1%/1%的分法更合理,因为一百万的1%也有1万,这对于验证集和测试集足够了。样本越多,测试集/训练集的比例越小。
测试集的目的是评估系统的整体性能,所以它的大小要足够大到可以提供高置信度的评估结果。一般来说1万或者10万的样本就可以了,这个数目远远小于训练集的需求。在有的应用,甚至我们不需要对系统性能有置信度很高的评估,那么可以不设立测试集,只需要训练集和验证集(有的教程会把样本分为训练集和测试集,这里的测试集就是NG说的验证集),但NG还是非常建议设立测试集来评估系统性能。
当测试集上的结果和实际运行不符合的时候,这说明要么样本集没有反应实际分布,要么评估指标不对。评估指标要能正确的反应实际使用中的优劣。
要有正交化的思维,第一步定义好评估指标,这是设立目标;第二步再考虑在这个指标下如何训练出更好的系统。这是两个完全独立的问题。不要把事情混为一谈,要一步一步做。
即使无法定义出一个很完美的评估指标和验证集,也要快速设立一个,然后加速团队对系统的迭代速度,发现选的不好,有更好的想法,则可以再更改。但千万不要在还没有把评估指标和验证集想清楚的情况下就胡乱的跑算法,那很浪费时间。
4. 为什么把人的性能(performance)作为深度学习算法的benchmark
两个原因:1)深度学习算法的性能已经可以和人一较高下;2)算法在达到人类性能之前,进步非常迅速,达到人类性能之后,进展会缓慢下来。
为什么算法到达人类性能后进展会变缓慢呢?两个原因:1)人类的性能已经很接近理论极限(Bayes optimal error,这是理论极限,实际永远不可能达到),进步空间有限;2)只要算法的性能低于人类性能,那么总有一些工具可以提高性能,而一旦超过人类性能,这些工具就都不太好用了。这些工具包括:获得更多人标记的数据、人工分析误差来源(可以通过思考“为什么人就可以做对”获得灵感)、更好的分析偏差/方差。理解人类为什么可以在 特定任务上表现的很好,这对于改进算法很有利。
我们会关注三个误差,a)Human-level error,近似Bayes optimal error;b)Training error,算法在训练集上的表现;c)Dev error,算法在验证集上的表现。a和c之间的差距是可避免偏差(avoidable bias),b和c之间的差距是方差。人类误差的作用就是帮助我们判断是聚焦于改善偏差,还是改善方差。
由于我们是用人类误差近似贝叶斯误差,所以这里说的人类误差是人类能达到的最好水平,比如普通人和专家,那我们要以专家的表现为准。当然,如果算法的实际使用场景只要求达到普通人的水平,那也可以以普通人的误差为准。
目前的算法对于结构化数据、非自然感知任务、有大量数据的问题的表现要优于人类。
5. 总结
监督学习的两个步骤:1)算法对训练集拟合的足够好,或者说可以做到很小的可避免偏差;2)训练集上的表现可以泛化到验证集/测试集上,或者说方差很小。对于第一个步骤,改善的工具有:用更大的网络(增加层数、隐藏单元数)、训练更久、用更好的优化算法(Momentum、RMSprop、Adam)、尝试新的网络架构(RNN、CNN)、更好的超参数、尝试新的激活函数。对于第二个步骤,改善的工具有:正则化(L2、dropout、data augmentation)、更多的训练数据、尝试新的网络架构、更好的超参数。
deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I 听课笔记的更多相关文章
- deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II 听课笔记
1. 误差分析(Error analysis) 误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进.NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是 ...
- deeplearning.ai 构建机器学习项目 Week 1 机器学习策略 I
这门课是讲一些分析机器学习问题的方法,如何更快速高效的优化机器学习系统,以及NG自己的工程经验和教训. 1. 正交化(Othogonalization) 设计机器学习系统时需要面对一个问题是:可以尝试 ...
- deeplearning.ai 构建机器学习项目 Week 2 机器学习策略 II
1. 误差分析(Error analysis) 误差分析的目的是找到不同误差源的比重,从而指引我们接下来往哪个方向努力改进.NG建议手工统计随机100个错误的误差源,比如对于猫分类器,错误的照片可能是 ...
- 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~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...
随机推荐
- 【java】实现一个简单的正则:判断一个字符串是否全由数字组成
package 正则; public class TestIsNum { public static void main(String[] args) { String s1="abc&qu ...
- OC学习7——类别、扩展和协议
1.我么在调用NSLog()方法打印一个对象时,实际上是调用了该对象的description方法,这个description方法就和Java中的toString()方法一样.所以,下面两行代码其实是一 ...
- Clonezilla SE---克隆linux------转载
引入: 本博文将会是<学生机房中的虚拟化>专题中的核心内容.因为,通过本篇博文的讲述,大家可以看到用于网络化批量部署Linux系统的Clonezilla SE搭建的全过程.注意,几乎所有命 ...
- ES6 Proxy和Reflect(下)
construct() construct方法用于拦截new命令. var handler = { construct (target, args) { return new target(...ar ...
- ElasticSearch 学习记录之ES高亮搜索
高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...
- Python的文件及异常
1. Python的文件及异常 1.1 文件操作 1.1.1 从文件中读取数据 许多情况下,我们的信息是存储在文本中的.例如对用户行为的分析,用户访问系统或者网站的访问信息会被存储于文本中,然后对文本 ...
- Bilateral Filter
最近在看图像风格化的论文的时候,频繁遇到 Bilateral Filter.google 一波后,发现并不是什么不得了的东西,但它的思想却很有借鉴意义. 简介 Bilateral Filter,中文又 ...
- 解决SVN造成的桌面图标问号
之前不小心直接将版本库 的内容检出 到桌面,后才发现桌面上的文件 都变成了问号,本来也以为没有多大问题,删除.svn 即可,可是删除所有的.svn后,桌面上还是显示问号,刷新了很多次,还重启电脑 了, ...
- NoFragment重大bug
在activity中切换fragment,有以下几点问题需要注意: 例如做一个类似于这样的tab切换fragment的,有以下几点问题 1.切换fragment后,前几个fragment能透视,解决方 ...
- 动态求区间K大值(权值线段树)
我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...