
吴恩达的新书出来了,在之前的文章中已经提到过了 吴恩达机器学习新书:MACHINE LEARNING YEARNING免费获取

这本书的主要内容不是讲解什么是神经网络什么是卷积操作,而是教你如何利用现有的深度学习知识在工程中进行应用,里面的许多概念还是比较有用的,毕竟都是大师的经验积累。
新书下载地址:https://space.oldpan.me/f/d6280ce6266b46098156/
(如果链接挂了会在24小时之内补好。)
整本书是用一章一章一节一节的方式来讲解的,类似于生活大爆炸的剧集,每节之间有细微的前后关系,但是单独挑出来也可以直接看。
本文截取整本书的前三分之一,一共分为上中下,不断更新。
全文目录(目前更新目录):
机器学习任务并不是直接拿来就可以上的,需要我们首先先进行分析,其次制定一系列策略。

比如一个识别猫的任务,你的团队首先有着以下的策略:
如何去选择?
这些选择很重要,很有可能会在之后的过程中决定任务是否可以成功的完成。
接下来内容将会带我们抓住机器学习任务中的一些细微的线索和现象。
从而决定采取哪种策略哪种方法,这将节省你们团队的大量时间。

假如你是团队的领袖,如何说服你的团队去按照你的想法来执行某一任务,比如使用单一数字评估指标(single-number evaluation metric)。
为什么将书做成一章一章一节一节的,是为了方便拿来阅读,每章每节都是可以单独拿来阅读的。
如果你无法说服你的团队,挑出本书的几个相关小节让他们去阅读吧!
首先,这本书并不是教你什么是机器学习,以及基本公式是什么什么的。
首先需要弄懂什么是机器学习、深度学习以及有监督训练的基本概念和流程:
https://cloud.tencent.com/developer/article/1149986
这本书的内容是在你已经懂得如何使用机器学习完成特定的任务的前提下,来帮助你如何更高效地挑选和使用机器学习策略,从而提高机器学习任务的正确率。
机器学习为什么在近年来大火,原因有两个:
对于原来传统算法,当你数据量增加的时候,算法的效果并不能随着数据量的增加而提升,根本原因在于传统的算法并不能“掌控”所有的数据。

我们稍微设计一个小型的神经网络,可以发现算法达到的效果比传统方法要好上很多(例如,识别手写数字,MNIST任务,使用神经网络轻轻松松使准确率达到98%)。

当我们的数据足够多的时候,搭建深度更深的神经网络达到的效果也会随之提升。

总之就是一句话,如果你的数据比较多的话100W+,那么请毫不犹豫地使用神经网络吧。
通常我们只关心训练集,毕竟我们的代码是在训练集上跑的么,但是验证集和测试集可是同样重要的!
(在原文中,验证集称为Dev(development) set 或 hold-out cross validation set)。
为啥重要,原文中举了个例子,比如我们想做一个app用来识别猫的品种。
于是,我们在网上,例如百度或者谷歌的图片栏中收集我们需要的猫的图像,然后我们进行了训练。在我们这头的测试结果是不错的,但是上线到APP的时候,用户自己拍上猫的图像使用我们训练好的权重信息去识别,识别效果却不怎么好。
这是为什么呢?
原因很简单,因为我们在训练时候测试(使用测试集的数据)的时候,甚至在验证(使用验证集的数据)的时候,使用的数据集的分布和实际中用户上传的图像的分布相差甚远。
也就是说,我们使用的数据集整体的分布和用户平时自拍的数据集的分布有很大程度的不同。
那么怎么去解决这个问题,当然是在自己的数据集中增加用户自己拍的数据,也就是不光从网上进行搜索,而且也收集一些用户自拍的数据,说白了就是使数据集的分布满足正太分布。
在训练集、验证集、测试集中都添加用户上传的图像来配合网络上的图像进行训练,这样算法的效果才可以达到最好。
相关文章:深度学习为什么需要那么多的数据
这个道理大家应该都明白,我们都知道在训练的时候,我们一般都是先在训练集上进行训练,其次在验证集上进行验证,去检验我们的算法是否正确。通过观察验证集的好坏来修改调整我们的算法。
但是如果验证集和测试集不是同一分布那会怎么样呢(比如验证集都是印度的猫,而测试集是中国的猫)?这样的话就比较难定位问题究竟出自哪儿了,有三种可能:
为此,我们要做的就是验证集和测试集来自同一分布,也就是收集自同一地区或者所有地区或者包含同样信息的数据。
一般我们在为第三方设计算法的时候,第三方提供的验证集和测试集往往不是采集于同一分布。因为第三方想要的结果是你们设计的算法具有很好的泛化能力,也就是不同领域的迁移能力,当然这种领域迁移(如迁移学习)也是深度学习的研究方向之一。但是如果你不是研究这个领域的,只是想设计一套算法从而完成一项工作,那么最好还是验证集和测试集采集于同一分布比较好。

验证集和测试集容量的大小的不同 –> 可以表示的模型精度的范围也不同
比如分类器A和分类器B的精度为别为90.0%和90.1%,如果你的验证集只有100个数据的话,那么这个0.1%就无法表现出来了,也就无法显示出算法略微提升的精度。
一般来说,验证集的数量为1000到10000比较合适。如果有10000个验证集数据的话,那么就可以观察到0.01%精度的提升了。(理论上,我们也可以测试在验证集下改变算法是否可以造成统计上的显著差异(statistically significant difference),如果有差异的话,还可以发一篇深入研究的论文,但是这种差异性对实际结果的影响往往并不大)。
当然,如果对于那种大规模的数据需求的公司,比如网页推荐商品推荐等,在这些领域中,仅仅0.01%的精度提升也可以带来很大的效益,那么验证集数量最好大于10000,这样就可以检测到更小的精度提升了。
那么测试集的规模应该如何呢?一般来说,只要足够表示算法整体的性能即可。一般都是抽取30%的数据作为测试集,这是在我们拥有100-10000个数据的前提下(也就是我们一般的情况)。但是如果我们的数据有10亿的级别,那么就没有必要抽取30%来作为测试集,因为即使验证集/测试集的数据一直在增加,但是在实际的所有数据中,测试集所占的比例还是越来越小的,所以只需要合适的验证集/测试集数量(足以衡量算法的性能)就可以,没有必要用很大的验证集测试集数据。
单一数字评价标准就是用一个指标来衡量当前算法的精度,比如一个简单的分类算法的准确度(分类算法A分类的精度为90%算法B分类的精度为89%,那么很容易得到分类算法A比分类算法B精度更好)。
但实际上,我们使用的往往不是单一数字评价标准来衡量。

准确率和召回率就不是单一的了,它提供了两个指标衡量你的算法好坏。但正是因此,我们并不好评价哪个算法比较好,正如上方的分类算法A和B的两个指标,做出选择是比较困难的。
关于准确率和召回率的详细信息:https://cloud.tencent.com/developer/article/2346548
如果你真的想用准确率和召回率,这时候就需要F1-score(或者其他的衡量标准)来统一一下两种评价标准:

也就是加权结合一下,加权的可以根据自己的具体任务要求来定,这样的话,我们就可以找到准确率最高的分类算法了:

这样有助于在机器学习任务中更快地决定方向,少走一些弯路。
吴恩达老师已经把中文版的《机器学习训练秘籍》发布了:https://accepteddoge.github.io/machine-learning-yearning-cn/docs/home/
相关的github地址:https://github.com/accepteddoge/machine-learning-yearning-cn/