选自towardsdatascience
作者:Kritika Jalan
机器之心编译
参与:陈韵竹、路雪
搭建机器学习系统好几周,性能却不尽如人意?Kritika Jalan 近日在 towardsdatascience 上发表文章,总结她从吴恩达的 Coursera 课程《Structuring Machine Learning Projects》中学到的相关经验。机器之心对此进行了编译。
如何选择策略以改进算法表现
你已经花了好几个星期构建机器学习系统。然而,它的性能却不能令你满意。你想到了许多方法来提高算法性能,比如收集更多数据、添加更多隐藏单元、增加更多层、改变网络架构、更改基本算法等。但是,哪种方案会给系统带来最大改善呢?你要么就得把这些方法都尝试一遍,投入大量的时间找出适合的方法。或者,你其实可以利用吴恩达的经验和技巧。
Source (http://pixabay.com/):Pixabay
正交化
构建机器学习系统的挑战之一是你有太多事情可以尝试、有太多事情可以改变。比如,你可以调整很多超参数。了解调整哪个参数能获得什么效果,这种方法叫作正交化(orthogonalisation)。因为正交化是一种系统属性,它确保了修改各个超参数不会对算法的其它部分产生影响。因此正交化令独立性地验证超参数与算法性能变得更加简单,减少了测试与调整的时间。
在监督学习中,机器学习系统需要在以下四项任务中表现较好。每一项任务都可以进行一系列调整来提升系统表现。
假设你的算法在训练集上表现不佳,你希望能调节一个或多个设置,以确保算法可以更好地与训练集拟合。你所调节的设置可能包括训练一个更大的网络、切换到更好的优化算法如 Adam 优化算法等。相反,如果你的算法在开发集上表现不佳,你可以调节关于正则化的某些设置,以满足第二个标准。因此,清晰地了解你所能调节的设置将帮助更快地改善你的系统。
单一数值评价指标
为你的项目准备一个简单的实数指标作为评价指标,以便知道调节某个设置是否有助于算法的改进。在测试多个场景时,该指标能够帮助你快速选择最有效的算法。有时,你可能需要两个指标来评估算法,比如查准率(Precision)和召回率(Recall)。但是如果有两个指标,就很难选出哪个算法更好。
将评价指标合二为一
因此,与其使用两个指标(查准率和召回率)选出一个分类器,不如找一个能将两者结合起来的新评估指标。在机器学习文献中,结合查准率和召回率的标准方法是 F1 分数(F1 score)。实际上,你几乎不需要自己设计新的性能评估指标,因为根据你的系统要求,通常能在机器学习文献中找到一个合适的指标。
F1 分数的计算式。
满意度量和优化度量
在某些情况下,不是只有一两个指标,而是 n 个。假设需要你创建一个最高准确率的分类器,且有着最低的时间复杂度和空间复杂度。然后你创建了以下 4 种 分类器,你会选择其中的哪种呢?
在这种情况下,你可以选择一个度量作为优化度量(optimizing),其他 n-1 个作为满意度量(satisficing)。在这个例子中,我们可以最大化测试准确率(optimizing),也就是将其作为优化度量;同时保证运行时间(Runtime)少于 10 秒,内存(Memory)要求小于 10MB,也就是将这两者作为满意度量,达到阈值即可。这样,你就为团队设立了一个目标。
机器学习领域中,人人都知道吴恩达。即使大家了解他,也会知道他在 Coursera 上有一个 Deep Learning Specialization 系列课程,该课程可以帮助你入门人工智能领域。其中一门课是《Structuring Machine Learning Projects》,从中你可以了解到如何诊断机器学习系统中的错误,并了解如何优先考虑某些方向以减少这些错误。本文正是基于这个课程而写的。
训练集/开发集/测试集的分布
始终保证你的开发集和测试集来自同样的分布,且是从全体数据中随机获取的。例如,假设你正在制作一个猫类分类器,且你有来自美国、英国、南美、印度、中国和澳大利亚的数据。使用前三个区域的数据作为开发集、使用后三个区域的数据作为测试集的做法是不正确的。你应该打乱这些数据,并将它们随机放入两个集中。
选择一个开发/测试集以反映你期望得到的以及重要的数据。
更改开发集/测试集和评估指标
如果项目进展到一半时,你意识到选择了错误的开发集或错误的性能评估指标,请更正。毕竟,机器学习的成功取决于:
1. 清晰了解目标(选择正确的开发集和评估指标)
2. 努力达到目标(在这些指标上表现良好)
如果系统在你的指标和开发/测试集上的性能与在应用上的性能并不匹配,你应该改变他们。因为你没有正确的设置目标。
前面主要是了解机器学习算法的应用、据此收集相应的数据,并随机分成训练/开发/测试集。此外,选择单一的优化评估指标,并且通过调整设置来改善这个指标也是提高系统性能的关键点。后面一部分主要关注的是如何令机器学习模型达到人类级别的性能与避免高偏差,这些经验同样都是基于吴恩达在 Coursera 上的课程。
与人类性能的对比
近年来,越来越多的机器学习团队对比机器学习系统和人类的性能。其原因在于:
1. 由于深度学习的进步,算法的性能突然变好,在机器学习的多个应用领域中具备更强的可行性。
2. 尝试做人类也能做的事情时,设计和构建机器学习系统的工作流程会更加高效。
如果你一直训练算法,它的性能就会快速提升,直到超越人类。尽管它无法超越一些理论限制,如贝叶斯最优误差(理论上的最优误差)。换言之,任何函数中从 x 到 y 的映射都无法超越一定的准确率。
通常,人类和贝叶斯误差非常接近,尤其是自然感知问题,因此超越人类性能后,系统就没有了很大的提升空间,学习过程也会相对减缓。
只要你的算法性能不如人类,就可以遵循以下方法来提升性能:
避免高偏差
我们希望算法在训练集上能有出色的表现,但又不希望它拟合地太完美,出现过拟合现象。因为我们知道人类级别的性能是怎么样的,所以我们可以判断模型在训练集上的拟合情况是不是很好、太好或者不够好。如下对于分类任务来说:
通过将人类级别的性能作为贝叶斯误差的代理(对于图像识别),我们可以大致了解是否需要关注偏差与方差之间的均衡从而提升系统的性能。
若人类级别的性能和训练误差之间差距比较大,那么模型的偏差可能就比较大。若测试集误差与训练集误差间的差距比较大,那很可能方差就会比较高,且模型出现了过拟合现象。
如果高偏差问题大于高方差问题,那么我们需要注意避免高偏差。
在上图场景 A 中,算法在训练集上拟合地并不好,因为人类级别的性能要远比训练集上的误差低,所以这个问题就是模型的偏差太高。一般解决办法是采用更大规模的神经网络、使用更好的优化方法、训练更多的迭代数或干脆修正神经网络的架构。
在上图场景 B 中,算法需要降低高方差,因为它在训练集拟合的情况要远比在测试集拟合的情况好。一般的解决办法是使用正则化技术、使用更大的训练数据集或干脆选择稍微浅层的神经网络架构。
原文链接:https://towardsdatascience.com/how-to-improve-my-ml-algorithm-lessons-from-andrew-ngs-experience-i-551ca1a32634