Machine Learning Yearning读书笔记(转载)

原文链接http://blog.csdn.net/qq_24818761/article/details/53465940


首先,非常感谢Andrew NG贡献的新书,本书总共大概50多章,昨天收到了1-12章(1-2页/章,总共23页)的手稿,让各位读者一睹为快。

附上书的下载地址:

1-12章:https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_01.pdf

13章:https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_02.pdf

14章:https://gallery.mailchimp.com/dc3a7ef4d750c0abfc19202a3/files/Machine_Learning_Yearning_V0.5_03.pdf


一、前言

先说说我对于此书的期待,本书作者是Andrew NG,我相信这个名字对于所有做机器学习的朋友来说都不陌生,斯坦福大学计算机科学系和电子工程系副教授,人工智能实验室主任,Coursera的联合创始人,14年加入Baidu IDL担任百度公司首席科学家。或许有许多人跟我一样,是从NG的机器学习视频中得到启蒙的,从此走上了machine learning的道路。在我看来,NG在Teaching方面做的工作为所有年轻学者、科研工作者以及工业界的研发人员带来了实实在在进步的力量。看过CS229课程的朋友可能会有很深的体会,NG讲的内容既深刻又浅显,既理论又实际,公布了大量学习的code以供相关学习,NG无非是想让机器学习的方法真正应用到实际生活中,让机器学习不光在学术上,也在工业上产生应有的价值。当然最终也包括本文提到的此书。(以上的啰嗦是本人对于NG的热衷之言,仅代表本人,勿喷!)



二、《Machine Learning Yearning》

1)Why Machine Learning Strategy

首先,本书列举了一下机器学习的应用包括:网页搜索,辣鸡邮件分类,语音识别,商品推荐等等等。。。然后,NG举了一个例子:如果有一个检测猫的检测器,当这个检测器表现不好的时候,你该怎么办?

● 收集更多的数据

● 让数据集更丰富:例如不同姿势、不同颜色的猫…

● 让梯度再飞一会儿

● 搞个更大的网络,多来几层、多来点神经元,最后加点参数

● 小的网络也不一定差哦

● 加入正则项 - 像是L2

● 把整个框架都换了(什么激活函数之类的)

这样做有一个顾虑,如果没有找准方向,那么你可能会白白花掉很多时间,那么我们该如何下手呢?


2)How to use this book to help your team

NG写此书的目的就在于,让读者了解机器学习算法在应用中出了什么问题,同时如何应对?

此书每一章只有1-2页,前12章没有看到一条数学公式,这对于恐惧英语和数学的同学来说是个好消息!


3)Prerequisites and Notation

这里告诉读者需要对监督学习有一定了解,如果不熟悉请先花一点时间学习(http://ml-class.org)

这里我也推荐一个网易公开课的网址:http://open.163.com/special/opencourse/machinelearning.html


4)Scale drives machine learning progress

两把利刃: ● 海量数据● 计算

我们用不同的算法(逻辑回归、小型、中型包括大型神经网络),随着数据的增加我们会发现什么呢?


有了这张图,你会得到一个结论:想让我的算法表现的好必须 (i) 搞个大的网络 (ii) 非常非常多的数据

然后NG泼了一瓢冷水,你想知道怎么搞定 (i)和 (ii),那太难了,咱们到时候再说,先整点在传统学习算法上有效的东西吧。


5)Your development and test sets

来咱们回到刚才那个猫的问题上:你想搞个app把用户上传的照片自动地分为【猫】和【非猫】(先不管谁会用这个app -_-)

然后大家就热火朝天的干起来了,去各大搜索引擎下载【猫图】和【非猫图】,按照传统的你7/3比例分成训练数据和测试数据。

一训练,嘿!能行。结果放到app上想试试,惊了!结果真是“香菇”。。

到底咋回事,你可能会认为那些用渣像素手机拍照的人根本不配用这个app,他们照出来的图跟我们网上下载训练的数据完全不一样。我们的算法根本没有考虑到手机图像的各种情况,也就是训练数据与测试数据分布不一致

这里有一个定义:

● 训练集 - 用于算法的训练;

● 开发集(我更习惯验证集)- 用于调参、特征选择等对你的算法进行调整;

● 测试集 - 用于最终算法结果的评估,不可用于任何算法参数的调整。

当我们定义好这些之后,我们就可以开干了,我们可以在验证集和测试集上看到各种结果。也就是说,我们整个机器学习系统的好坏完全依赖于这两个数据集。这里,NG提到很重要的一点:


大家自我感受一下。


6)Your dev and test sets should come from the same distribution

这里还是说的验证集测试集分布的问题,来张图大家就能懂了(不带任何歧视,仅问题分析)


当你的算法在验证集上表现良好,在测试集上表现很差,大家反应就是过拟合,我们需要通过一系列的手段来防止过拟合(例如收集更多数据,添加正则项等等现在DL中相关的方法五花八门)。但这都是仅仅建立在验证集和测试集来自同一个分布的假设上。

假如验证集和测试集来自不同的分布,那么可能有以下可能导致上述现象:

● 在验证集上过拟合了;

● 测试集的case比验证集上的case难度高,这不是搞区别对待吗;

● 测试集的case压根与验证集上的case根本不一样好吗,你叫我怎么检测;

最后NG提到,如果你的目标是在特定的机器学习应用上能表现的好,那么还是把验证集和测试集选为同一个分布下的case,让你的工作更轻松哟,信我啊!


7)How large do the dev/test sets need to be?

我们到底要多少数据呢,这是个大问题。

验证集 - 假如我们有2个算法A和B,正确率分别为90.0%和90.1%,但是我们只有100个验证数据,那么我们根本没法检测到这0.1%的差别。

下面还举了一个例子,因为0.01%结果的提高增加了某公司的收入。细思极恐啊,我当初都干了什么!

测试集 - 如果你的数据不多100-10000这个大概范围,那么3/7比例还适合你。如果你的数据已经非常庞大了,那么其实可以减少这个比例。


8)Establish a single-number evaluation metric for your team to optimize

我们还得整一个评估标准吧,分类正确率是个不错的选择。不过,如果我关心的指标有2个(Precision、Recall),这就有点纠结了你知道吗?我该怎么对一系列的分类器进行性能的排序,最终选出最优的分类器呢?


这里,我们可以引入一个指标“F1-score”,具体计算请看wiki(https://en.wikipedia.org/wiki/F1_score)。

于是乎,我们得到了下表:


这下舒服多了,我要开始刷分了,别吵我!


9)Optimizing and satisficing metrics

这里提供另一种结合多种因素评估的方法。假如你又关心正确率又关心运行的效率(事儿咋这么多呢)


我们可以这样定义评估标准:

Accuracy - 0.5*RunningTime

或者你可以设置一个运行时间的阈值,例如100ms,那么这个值就是“条件度量”,然后我们在这个前提条件下优化我们的正确率,正确率称之为“优化度量”。

那如果你有N个因素怎么办?很简单,你可以选择N-1个维“条件度量”,剩下的一个作为“优化度量”,怎么样是不是很有效的方法?


10)Having a dev set and metric speeds up iterations

最终,我们拿到一个新问题,怎么来不断的推进我们的工作呢?请看Machine Learning循环大法!


1.首先整点洋气的点子(idea);

2.然后将这些点子变为代码(code);

3.通过实验(experiment)来评估下能不能行(通常你的第一次。。咳咳咳,回去1重新来吧)。


11)When to change dev/test sets and metrics

NG会很快地选好验证集/测试集和评估标准,这样能给团队一个非常清晰的目标导向(程序猿苦逼脸)。如果在一些更加成熟的应用上,你可能得考虑考虑。如果你发现根据验证集上的评估结果,分类器A比分类器B表现的要好,但是你的同事认为B要优于A,这就说明兄弟你可能要更改你的验证集/测试集或评估标准。

有以下3点可能导致分类器A在验证集上表现“良好”:

1.想要在实际中表现的好,但是实际中的case跟我的验证/测试集不是一个“妈”(分布);

2.在验证集上过拟合了;

3.评估标准是否和我的目的有些不一致。

整个过程提倡一个“早发现,早治疗”!


12)Takeaways: Setting up development and test sets

● 你的验证集和测试集都的分布,最好能反应以后想要预测的数据情况;

● 尽量从同样的分布中选验证集和测试集;

● 选择一个评估标准,别跟我说有好多;

● 多试试不同的办法,天知道那个管用的;

● 别花太多时间准备数据集和评估(赶紧上车,来不及解释了);

● 对于新的问题,给你一周时间准备数据和评估标准,经典的问题可以多想想;

● 当你的数据多了以后,老一代的7/3比例不管用了,最好降低一下这个比例;

● 你的验证集最好大到能检测到一定的效果提升,但也别太大了,测试集则最好能大到给出一个最终系统的置信估计(不太明了)。

● 如果你的验证集和评估标准不适用了,赶紧换了它们:

(i)在验证集上过拟合了,收集多一些验证集 

(ii)如果你实际中的分布与验证集/测试集不同,更换验证集/测试集 

(iii)如果你的评估标准也不行了,也换了吧。


三、后语

哎,收了收了,有点累,到时候再写!


—————————————————————————————————————————————–

2016.12.8

12.7和12.8 NG又分别发布了13和14章,在这里继续补上。

13)Error analysis: Look at dev set examples to evaluate ideas

这一章主要通过误差分析来评价我们当前系统的性能,并分析了该如果应对。


当我们发现有时候我们错把狗判断成了猫,我们改如何改进我们的系统?NG提议在尝试一个新方法之前,首先对结果提升的空间做一个评估:

1.你可以从验证集中取一些分错的例子(本来是猫,却被分类器判断为狗);

2.然后通过手动的方法标注分类器误判的比例(本来是猫,分类器判断为狗,我通过眼睛能看出是猫)

这个过程就是“误差分析”,如果这个比例只有5%,无论怎么改进,都不会超过5%的错判例子被重新解决。

这个5%称之为“上界”,因此如果系统当前的正确率为90%,那么改进后最好的性能为90.5%。

Acc_improve = Acc_original + (1 - Acc_original) * 5%;

如果“上界”的比例为50%,那么系统的性能可能从90%提升至95%。

最后,NG提到许多工程师不情愿做这样的误差分析,以至于浪费掉大量的开发时间。


14)Evaluating multiple ideas in parallel during error analysis

这一章,NG主要从多个角度分析误差,然后对症下药

对于一个猫的检测器,可以从以下几个方面来提升:

● 修正那些本来是“狗”,误判成“猫”的例子;

● 修正那些“猫科动物”(狮子,豹子),误判成家猫的例子;

● 提升在图像较模糊情况下的系统性能;

为了效率,你可以同时来评估这些因素,然后把这些错判的例子列一个表:


由于一张Image可能同时满足几个因素,所以最终的比例加起来不一定是100%。

然后我们根据这些图像,通过人为的办法观察这些图像,考虑是否在这张表上添加新的因素(列)。

这是一个慢慢分析和调整的过程,可以通过这张表,了解到当前错判例子中的一些信息。或许开始的时候只有几个因素,但是随着问题的深入,你会加入更多的因素来分析问题,也会让你更加了解数据和算法性能。


通过上面,我们可以清晰的了解到,解决“狗”错判为“猫”的例子最多只能解决8%的错误,集中解决“猫科动物”和“图像模糊”的问题会提升更多。最后,错误分析不是通过严谨的数学公式证明,而是通过这种统计能使你知道下一步的方向,并且了解到你的应用还能有多大的进步空间。

已标记关键词 清除标记
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页