要成功地使用深度学习技术,仅仅知道存在哪些算法和解释它们为何有效的原理是不够的。一个优秀的机器学习实践者还需要知道如何针对具体应用挑选一个合适的算法以及如何监控,并根据实验反馈改进机器学习系统。在机器学习系统的日常开发中,实践者需要决定是否收集更多的数据、增加或减少模型容量、添加或删除正则化项、改进模型的优化、改进模型的近似推断或调试模型的软件实现。尝试这些操作都需要大量时间,因此确定正确的做法,而不盲目猜测尤为重要。

本书的大部分内容都是关于不同的机器学习模型、训练算法和目标函数,这可能给人一种印象——成为机器学习专家的最重要因素是了解各种各样的机器学习技术,并熟悉各种不同的数学。在实践中,正确使用一个普通算法通常比草率地使用一个不清楚的算法效果更好。正确应用一个算法需要掌握一些相当简单的方法论。本章的许多建议都来自Ng(2015)。

我们建议参考以下几个实践设计流程:

  • 确定目标——使用什么样的误差度量,并为此误差度量指定目标值。这些目标和误差度量取决于该应用旨在解决的问题。
  • 尽快建立一个端到端的工作流程,包括估计合适的性能度量。
  • 搭建系统,并确定性能瓶颈。检查哪个部分的性能差于预期,以及是否是因为过拟合、欠拟合,或者数据或软件缺陷造成的。
  • 根据具体观察反复地进行增量式的改动,如收集新数据、调整超参数或改进算法。

性能度量

确定目标,即使用什么误差度量,是必要的第一步,因为误差度量将指导接下来的所有工作。同时我们也应该了解大概能得到什么级别的目标性能。

值得注意的是,对于大多数应用而言,不可能实现绝对零误差。即使你有无限的训练数据,并且恢复了真正的概率分布,贝叶斯误差仍定义了能达到的最小错误率。这是因为输入特征可能无法包含输出变量的完整信息,或是因为系统可能本质上是随机的。当然我们还会受限于有限的训练数据。

训练数据的数量会因为各种原因受到限制。当目标是打造现实世界中最好的产品或服务时,我们通常需要收集更多的数据,但必须确定进一步减少误差的价值,并与收集更多数据的成本做权衡。数据收集会耗费时间、金钱,或带来人体痛苦(例如,收集人体医疗测试数据)。科研中,目标通常是在某个确定基准下探讨哪个算法更好,一般会固定训练集,不允许收集更多的数据。

如何确定合理的性能期望?在学术界,通常我们可以根据先前公布的基准结果来估计预期错误率。在现实世界中,一个应用的错误率有必要是安全的、具有成本效益的或吸引消费者的。一旦你确定了想要达到的错误率,那么你的设计将由如何达到这个错误率来指导。

除了需要考虑性能度量之外,另一个需要考虑的是度量的选择。我们有几种不同的性能度量,可以用来度量一个含有机器学习组件的完整应用的有效性。这些性能度量通常不同于训练模型的代价函数。我们通常会度量一个系统的准确率,或等价地,错误率。

然而,许多应用需要更高级的度量。

有时,一种错误可能会比另一种错误更严重。例如,垃圾邮件检测系统会有两种错误:将正常邮件错误地归为垃圾邮件,将垃圾邮件错误地归为正常邮件。阻止正常消息比允许可疑消息通过糟糕得多。我们希望度量某种形式的总代价,其中拦截正常邮件比允许垃圾邮件通过的代价更高,而不是度量垃圾邮件分类的错误率。

有时,我们需要训练检测某些罕见事件的二元分类器。例如,我们可能会为一种罕见疾病设计医疗测试。假设每一百万人中只有一人患病。我们只需要让分类器一直报告没有患者,就能轻易地在检测任务上实现99.99999%的正确率。显然,正确率很难描述这种系统的性能。解决这个问题的方法是度量精度(precision)和召回率(recall)。精度是模型报告的检测正确的比率,而召回率是真实事件被检测到的比率。检测器永远报告没有患者,会得到一个完美的精度,但召回率为零。而报告每个人都是患者的检测器会得到一个完美的召回率,但是精度会等于人群中患有该病的比例。当使用精度和召回率时,我们通常会画PR曲线(PR curve),y轴表示精度,x轴表示召回率。如果检测到事件发生了,那么分类器会返回一个较高的得分。例如,我们将前馈网络设计为检测一种疾病,估计一个医疗结果由特征x表示的人患病的概率为\(\hat{y}=P(y=1 \mid x)\)