1. Why Maching Learning Strategy
Chapter1指出本书的出发点,举了个栗子——建立一个可以检测图片中的猫的计算机视觉系统,如果还没达到想要的检测效果,一般会有一系列的改进的ideas:搜集更多的训练数据,即更多猫的图片;搜集一个更多样性的数据集——多样性体现在猫在图片的位置不同,猫的颜色更加不一样等等;训练模型的时候多用时间,即增加迭代次数;换一个更大的神经网络,更多层更多参数;或者尝试一个小一点的网络;增加正则化项;改造下网络结构(隐含单元个数,激活函数等)......
如上所述,对于一个问题,可以改进的方法有很多,而这本书旨在告诉我们哪些值得去尝试,哪些不值得,而不是盲目一样样地尝试,毕竟需要很多时间成本,即如何更好地确定技术改进方向。
2. How to use this book to help your team
Chapter2无关技术,略过~~
3. Prerequisites and Notation
Chapter3——读这本书之前,最好了解监督学习,神经网络(深度学习),若不熟悉,可以先学习Coursea中的机器学习课程。
4. Scale drives machine learning progress
对于深度学习,如今两大驱使其发展的动力为:1)可获取大量的数据——电子设备的发展,使得获取海量训练数据成为可能;2)计算规模的提升——可以训练更大的神经网络,更好地提取利用大量数据中的信息。
图(a) 图(b)
如上图(a)所示,对于传统机器学习算法,当数据量不断增加时,学习曲线会逐渐到一个所谓的“plateaus”,即曲线趋于平缓不上升,performance不会再改善,而如果在同样任务下训练一个小型神经网络,可能会得到更好的performance,如图(b)所示,但同样地曲线还是会逐渐趋于平缓。若尝试更大的神经网络,如图(c)所示,会得到更好的performance,当然这是建立在数据量较大的前提。
图(c)
最后有个小结论:改善算法的performance——增加更多的数据和训练一个更大的网络。还要注意一点,当数据量比较小时,比起用什么算法(传统方法或者深度学习),最终的performance更依赖于手工设计的特征;而当数据量较大时,用神经网络往往会更好些。
5. Your development and test sets
定义训练集为学习算法用的,开发集(验证集)用于调参,筛选特征等来调整算法,测试集则不用于调整算法,只用于评估算法的效果。
开发集和测试集时用来指导改进算法的方向。一般来说,会按7:3的比例将数据集切分为训练集和测试集,但当泛化不好时,即你未来要应用的数据的分布不同于训练集的数据分布,模型在训练集表现很好,真正应用的时候效果不好,需要用其他方法尽量获取能够反映要应用的数据的开发集和测试集。
6. Your dev and test sets should come from the same distribution
开发集必须最大程度反映你要改进的任务。
还有一点是,开发集和测试集数据分布要一致。这样的话若在开发集表现很好而在测试集表现不好,我们可以判断这是过拟合,从过拟合出发去解决问题;若来自不同分布,则可能有几个原因:1)在开发集上过拟合;2)测试集比开发集要难(含有更难解决的数据),而开发集足以代表要真正解决的任务,所以可能不需要再做进一步的优化;3)测试集和开发集数据分布不同,在这个情况下,基于开发集做优化并不能有效提升在测试集上的performance。
在真正做机器学习应用时,保持开发集和测试集的一致至关重要。若分布不同便不能真正确定在开发集有效提升是否也能在测试集有同样表现。
7. How large do the dev/test sets need to be?
一般开发集的大小为1000~10000个样本,当然还是得视具体任务而言,例如,两个分类器的分类准确率相差0.1%,此时开发集只有100个样本的话是检测不出两个之间的差异。
而关于测试集的大小,一般取数据的30%,这个适合于中等规模的数据(即大概100~10000个样本)。但当数据规模比较大时,比如十亿级,测试集和开发集的占比可以调小,因为足够样本数量的开发集和测试集就能够评估算法的performance了,而不需要太多。总的来说,测试集也必须足够大的来能够反映出算法的performance。
8. Establish a single-number evaluation metric for your team to optimize
这一部分开始讨论评估指标。一般会建立一个单一数字的评估指标,例如分类准确率;那如果是有两个指标查准率precision和查全率recall,会难以评估比较,则可以用F1分数结合了查准率和查全率,当然有很多种结合方式,只是F1分数是比较有效的一种。有了单一数字的评估指标,会加快评估过程,选择最优的优化方向。另外,取平均值和加权平均是结合多种评估指标最常用的方法。(关于F1分数,可以到这里了解更多。)
9. Optimizing and satisficing metrics
假设现在有三个分类器关于算法的两个指标准确率和运行时间数据如下,若用比如Accuracy-0.5*RunningTime来结合两个指标显得不自然,因为两个之间无关联。换个思路,可以先定义可接受的RunningTime,比如要求在100ms内,即运行时间是“满足指标”,接着在这一标准下最大化Accuracy,即准确率是“优化指标”。所以最终的评估指标是——在最多100ms的运行时间内,准确率越高越好。
所以当有N个评估指标时,可以设置N-1个“满足指标”,剩下一个为“优化指标”。
10. Having a dev set and metric speeds up iterations
建立一个机器学习系统的步骤:1)由一些idea开始着手建立系统;2)用代码实现这些idea;3)做实验得出结果评估idea的效果,然后想出更多的idea,回到第一步不断迭代完善。
有了开发集和测试集,以及评估指标,就能快速评估idea有效与否,朝着正确的优化方向,加速这个迭代的过程。
11. When to change dev/test sets and metrics
一般开始一个机器学习项目时,会尽快给定初始的开发集和测试集,以及评估指标。然后在接下来的算法优化过程中,如果发现评估结果与经验认知有比较大的区别时,可能就需要修改开发测试集或者评估指标了。而可能的原因有三个:
- 开发集测试集的数据分布与实际应用场景的分布不同。
- 在开发集上过拟合,就需要换开发集了。当然可以规律性地在测试集评估,看是不是过拟合,但不能作为决策的根据,不然会开始在测试集上过拟合。
- 评估指标评估的与实际项目要优化的目标不一致。除了看评估指标的结果之外,也会注意分析算法模型以及之间的差异区别,及时发现评估指标存在的不足。例如,在现有评估指标下分类器A比分类器B效果更好,但是发现A分类器会漏掉对一些垃圾信息的过滤,这部分是不可接受的,此时可以修改评估指标,增加对漏掉垃圾信息的惩罚。
12. Takeaways: Setting up development and test sets
对前面的总结:
- 选择能够反映未来要应用的数据的开发集和测试集,且可能的话开发集和测试集来自同个分布。
- 选择一个单一数字的评估指标作为优化的对象,若有多个指标,则考虑将它们结合成一个或者定义满足指标和优化指标。
- 机器学习是一个迭代的过程,在一堆ideas里面找到满意的。开发集测试集和单一数字的评估指标帮助你快速评估算法,加快迭代。
- 当数据量很大时,不用按照70%/30%的比例来切分成训练集和测试集,开发集和测试集的比例可以远小于30%。
- 开发集的大小要能够检测出算法的有效改善,但又不需要太大。测试集的大小要能够对系统最终的performance做出一个置信估计。
- 若开发集和评估指标不能指导正确的方向,要快速做出修改。
13. Build your first system quickly, then iterate
当开发一个AI应用时,应该快速建立一个基本的系统,尽管这个离“最好的系统”还很远。我们会从最基本的系统出发,接下来去找到指导正确方向的“线索”,逐步改善系统。
14. Error analysis: Look at dev set examples to evaluate ideas
误差分析指的是查看分析被错误分类样本的过程。在发现可以改善的方向之后,可以进行误差分析,大概分析这个方向可以给最终的结果带来多大的改善。比如,你开发一个识别猫的APP,然后发现有些长的像猫的狗会被识别为猫,如果想往这个方向去改善(采集一些狗的图片作为负样本之类),可以先采样包含100个被错误分类样本的开发集,再人工去查看多大的比例为狗的图片。
如果只有很少的比例为狗的图片,那么可能不值得沿着这个方向去改善算法,因为所花的时间成本等带不来足够的效果上的提升,可能最后只会提高0.5%的准确率。所以,误差分析能够一定程度上分析误差的来源,然后评估哪个方向值得去投入。
15. Evaluating multiple ideas in parallel during error analysis
当你同时有多个idea来改善你的算法,有个方法可以有效率地并行评估这些idea。可用如下列表所示,查看被错误分类的样本集合(约100个左右),可以看各个情况的占比,同时写下comment,即被错误分类的原因,然后统计各部分的比例。
当然你在检查数据的时候也可能发现新的被错误分类的原因,可以及时添加到表格中,拥有较大比例的被错误分类种类或者被错误分类的原因即作为下一步改善算法的方向。
误差分析是一个迭代的过程。一开始没有想法也无所谓,可以在检查样本的时候,得到误差种类,同时不断得到新的idea,又回过头去过一遍样本集,可能又会得到新的idea。误差分析不会提供一个严谨的数学公式来告诉你哪个idea最值得去尝试,你需要考虑你能在这个方向上取得多大的改善,以及所能承受的工作量。
16. Cleaning up mislabeled dev and test set examples