废话不多说,先上书封面!
首先,非常感谢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%的错误,集中解决“猫科动物”和“图像模糊”的问题会提升更多。最后,错误分析不是通过严谨的数学公式证明,而是通过这种统计能使你知道下一步的方向,并且了解到你的应用还能有多大的进步空间。
未完待续。。。