陈曦,朱小栋
第一部分 导言
第一章 为什么需要机器学习Strategy战略?
第一点,为了解决学习算法精确度不够好的问题。解决方法包括:更多的数据,更多元的训练集,更多的梯度下降迭代次数,更大或更小的NN(神经网络的层数,隐藏层的单元,参数),利用L2正则法,还有NN的结构(激活函数,隐藏层单元的数目等等)。
第二点,可以节约开发的时间成本。
第二章 这本书对你的团队有什么帮助?
优化你的项目帮助你的团队提高生产力。
第三章 前提和注解(prerequisites & notation)
你需要了解的背景知识包括:监督学习和深度学习(NN)
第四章 规模驱动机器学习的进步(scale drives machine learning progress)
最近的进展中两个最大的驱动器:
- 数据的可得到性(通过移动设备digital devices我们可以得到大量的用户数据)
- computational scale计算规模(利用庞大的数据集训练NN)

作者将传统机器学习算法,小型NN,中型NN和大型NN在数据增长情况下的表现进行了如上图的展示。很直观的可以看出,大型NN表现最好并随着数据量增加表现更好。随之是中型NN,同时也会随着数据量的增加表现出更好的精确度。而小型NN表现略好于传统机器学习算法,然而后两者在数据量增多时不会有更好的表现了(后段的曲线处于水平状态)。
第二部分 设置开发和测试集(setting up development and test sets)
第五章 你的开发和测试集
当你开发一个手机图像识别的app软件(例如识别猫)的时候,你利用的是网页上所找到的猫的图像,那么结果将不尽如人意。因为手机中猫的图像和电脑中所找的猫的图像差别较大。你最好是能够在你的验证集dev和测试集中利用真实的用户数据。另外,不要设想你的训练集和你的测试集分布会是一样的。
总结一下训练集,验证集和测试集各自的作用:
- 训练集把模型跑出来
- 验证集看结果,通过调参/选特征的方式去提高精确度
- 测试集:看调整好的算法的表现,但不用做考查算法和参数的标准
第六章 你的验证集和测试集应该来自于同一分布
验证集和测试集不来自于同一分布时,会出现如下情况而导致最终在算法在测试集中的表现很差:
- 过拟合验证集
- 测试集比验证集更难,因而在验证集上做出的调整对测试集没有帮助
- 测试集和验证集就是不一样
作者引出了一个学术上面的启发点,他说:” It is an important research problem to develop learning algorithms that are trained on one distribution and generalize well on another.”
有相关研究是在不同的分布集上调整过的算法仍能有不错的表现。例如,数据集A和数据集B两者分布不一致,但是在数据集A中调整出来的算法仍能在数据集B中表现不错。
第七章 验证集/测试集应该有多大?
那么当我们需要侦查0.1%甚至0.01%的区别时,需要用更大规模的dev set(大概要1000-10000的样本的数据量)。
这章的最后一段文字有点没看明白。。
How about the size of the test set? It should be large enough to give high confidence in the overall performance of your system. One popular heuristic had been to use 30% of your data for your test set. This works well when you have a modest number of examples—say 100 to 10,000 examples. But in the era of big data where we now have machine learning problems with sometimes more than a billion examples, the fraction of data allocated to dev/test sets has been shrinking, even as the absolute number of examples in the dev/test sets has been growing. There is no need to have excessively large dev/test beyond what is needed to evaluate the performance of your algorithms.
第八章 为你的团队建立一个单一的评估指标

这里通过介绍权衡精确度precision和召回率recall引出F1-score的概念,并且你可以根据你所在意的情况去创造自己的F1-score。精确度表示的是被标记为猫的图像并且的确是猫的比例,而召回率表示的是所有猫的图像中被正确标记为猫的比例。假如你更在乎在最后标记中有没有标记错误的情况出现,你可以适当的提高precision在计算F1-score中对其大小的作用。另一方面,如果你更在意的是不希望算法在识别猫的图像时遗漏部分猫的图像,这种情况下你可以相应提高recall的影响力。我认为可能是在写论文中可以用到的一个创新点,自己设置一个符合自己数据情况的F1-score。
第九章 优化度量(optimizing and satisficing metrics)
一个例子是如何权衡tradeoff精确度和时间的问题:

那么可以首先设定一个时间的标准threshol阈值,一旦超过就不再考虑它不管它的精确度有多好。可以在通过公式
计算后进行相应的选择判断。
其他类似的情况包括对文件的大小(binary file size)设置阈值,还有针对不同情况对FP(false positive rate)比值和FN(false negative rate)比值设置阈值。
第十章 用验证集和度量(metric)加速迭代

首先有了一个想法以后就建立系统,然后用代码实现出来,最后做实验。实验的衡量标准是用验证集和度量(metrics)判断方向是否正确。一个不断的迭代过程,出现错误或可以改进的方式,再重新更改代码,最后实验。
第十一章 什么时候改变验证集/测试集和度量?
文章中的例子是当分类器A和分类器B在同一度量下,分类器A的表现更好,但是团队认为实际上分类器B更适合所开发的产品。此时出现这种情况的原因如下:
- 真实情况下(实际应用中)分布的数据与验证集/测试集的分布不一样
- 过拟合了验证集(可以换一组验证集)
- 度量测量的项目以外需要优化的东西(这里只能看书上提供的例子去理解一下了)
总结下来,走错方向的时候要改变验证集/测试集和度量,找新的方向。
第十二章 打包带走(takeaways)
- 选择验证集和测试集的分布要考虑到能够反映您期望未来所获取的数据的分布。这可能与您的训练数据分布式不一样的。
- 如果可能的话,从同一分布中选择开发和测试集。
- 为您的团队选择一个单数评估指标进行优化。如果有多个你关心的目标,考虑把它们合并成一个公式(比如平均多个错误作为度量)或定义一个让你满足和能够优化的度量。
- 机器学习是一个高度迭代的过程:在你找到一份满意的之前,你可能会尝试几十个想法。
- 拥有验证/测试集和单一数量的评估指标可帮助您快速评估算法,因此迭代速度更快。
- 当开始使用全新的应用程序时,尝试很快地设置验证/测试集和度量标准(在不到一周的时间内)。但在成熟的应用程序上花费更长时间是没有问题的。
- 旧的启发式分成70%和 30%的训练集合和测试集可能不适用于您有很多数据的情况下,验证和测试集可能远远少于30%的数据。
- 你的验证集应该足够大以便能够检测到你的算法的精确度变化,但不一定要大得多。你的测试集应该足够大以便给你的系统的最终性能(performance)一个置信度的估计??
- 如果您的验证集和度量不再给您的团队指向正确的方向,那么快改变它们:(i)如果你过度使用开发集,获得更多的开发集数据。(ii)如果实际你关心的真实分布数据与验证/测试集的分布不同,需要用新的验证/测试集数据。 (iii)如果您的度量不再衡量您最重要的指标,那么您要改变度量。