深度学习实用策略

本文翻译自DeepLearning balabala

引言

要想在实际生产中应用深度学习技术,仅仅知道算法的公式与原理是远远不够的。优秀的数据工作者需要能够根据特定的应用选择合适的算法,并能够根据实验过程中算法的反馈信息不断进行优化——是收集更多的数据,还是增加模型的复杂度,或者改变数据预处理方法,抑或是对程序进行调试等等。所有这些优化方法都需要耗费大量时间,没有方向性地乱撞显然是行不通的,需要有一些通用的、原则性的指导。

机器学习领域有各式各样的模型、训练算法与目标函数,这会给人一种“错觉”,对机器学习专家来说最重要的是掌握各式各样的机器学习技法和各个相关领域的数学知识。实际上,如果使用恰当,即使是烂大街的普通算法,也要比马马虎虎、一知半解使用的“高级”算法效果要好很多。而正确地使用算法很简单,掌握一些很简单的原则与策略就足够了。下面是推荐的机器学习系统设计流程:

  • 决定目标——首先要明确算法的性能衡量指标(原文是error metric),以及要将这个衡量指标优化到什么程度。
  • 尽快建立end to end的pipeline,包括恰当地估计性能指标。
  • 找出系统的瓶颈,并有针对性优化。找出系统的哪个部分表现低于预期并分析原因——是因为过拟合还是因为欠拟合,还是数据或或代码出了问题。
  • 不断地进行增量式调整——比如收集新的数据或者调整先验参数,甚至更换算法。

为了详细介绍上述的流程,将使用经典的街景门牌号识别系统为例进行说明。街景车能拍下建筑的门牌号并记录拍摄时的位置,该系统识别图片中的门牌号,并在谷歌地图中的相应位置更新信息。相信随着读者一步步了解这个成功的商业应用系统是如何构建的,可以加深对上面提到的设计流程的理解。

性能衡量指标

决定系统的性能衡量指标(即error metric)是相当重要的第一步,因为后续所有的工作都是围绕着这个指标进行的。另外,也要对系统的性能要达到何种程度做到心中有数。

系统的性能衡量指标跟算法要优化的损失函数多数情况下并不相同,比如简单二分类问题,损失函数可以是LR中交叉熵损失、后者SVM中使用hinge loss,或者是简单的感知机使用的0-1损失,但是我们对算法的性能衡量指标却可能是查全率、查准率或者是综合考虑查全率与查准率的…..。

需要明确的是,绝大多数系统都是做不到没有任何错误的。即使你有无限的多的训练数据而且能恢复真实的概率分布,也突破不了贝叶斯错误(Bayes error)的下界。因为特征含有的信息可能相对于输出变量来说并不完全(比如只知道),或者系统本身就含有随机性。何况获取无限的训练数据也是不可能的。

训练数据的多少受到多种因素的制约。实际的应用存在训练数据量与性能的trade-off,收集数据是需要付出代价的,时间、金钱、人力都需要考虑,需要在数据量增加带来的受益与收集数据付出的成本之间进行权衡。如果目的是偏学术性的,要衡量不同算法的性能,那么使用的训练与测试数据是公认的benchmark,是不能够对数据随便进行更改的。

如何决定要将衡量指标优化到什么程度呢?如果是学术研究的话,至少要比当前的其他算法性能要好后者差不多吧,否则也没有意义。实际商业应用的话,考虑的因素就多一些,