大数据文摘作品
编译:张南星、惊蛰、荆浩男
一、怎样高效开发机器学习产品
想要开发通用AI,首先你得掌握逻辑回归模型。
从最基础的开始
在大多数领域,当人们尝试用科学的方式理解世界时,都会选择先宽泛研究整体的内容,而不是立马深入到重要的细节之中。
譬如在物理学领域,我们常常从简单的模型开始(牛顿物理学)做研究。然后,我们在逐渐认识到最初的一些假设并不正确时,就会慢慢开始使用更复杂的模型。这种方式可以以最简单的方法高效地解决问题。
凡事力求简单,但不要过于简单。
——阿尔伯特·爱因斯坦 |
同样的思维模式,即从最简单的模型开始建造,也可以应用于AI工程之中。并且在大多数情况下,这样的方式都很有价值。
事实上,在Insight上目睹成百上千个项目从想法发展成实际产品之后,我们发现将一个简单模型作为基础版本,往往能让最终产品变得更棒。
但在解决复杂问题时,简单的解决方案(比如下文中讨论到的基线模型)存在诸多不足:
- 简单的解决方案有时会忽略输入中的重要内容。例如,简单的模型常常会忽略词语在语句中的顺序,或者变量之间的关系。
- 在生产比较细致的产品时,这些模型往往有些力不从心。因此,大多数简单模型都需要配合使用启发式算法或者人工制定的规则才会面世。
- 它们研究起来可能并不那么有趣,而且可能没法让你学到自己渴望的前沿研究知识。
这些简单解决方案产出的错误输出常常看起来非常愚蠢,所以标题中用了“不忍直视”这个词。但是,正如本文所说的,在项目启动时,简单模型的价值就会大大体现,因为这些模型可以帮助我们更好地理解实际问题,从而告知我们开发出最终成功产品的***路线。
用George E. P. Box的话来说:“所有的模型都是错的,但至少其中一些会有点用处。”
再换句话说,如果你只想找点乐子,那从复杂的模型开始没问题;但是如果你希望真正解决某个问题,并开发真正产品的话,那就从简单得“不忍直视”的模型开始吧。
二、什么是基线模型?
“当从散点图中预测数据关联性比画星座图更难的时候,我不相信线性回归得到的结果”:
左:方差为0.06的线性回归模型
右:Rexthor“遛狗”模型
不同的分布类型需要不同的基线模型。下面是一些值得考虑的基线模型:
- 线性回归:从一系列特征值中预测连续值的首要可靠方法,例如价格和年龄
- 逻辑回归:当需要对结构化数据或者自然语言进行分类时,逻辑回归模型能迅速给出可靠的结果。
- 梯度提升决策树:不可错过的Kaggle经典!在和时间或者通用结构化数据相关的预测处理中,忽略梯度提升决策树简直是不可能的事。虽然这个模型比其他基线模型在理解和使用上稍难一些,但是效果会很不错。
- 简单脑回框架:恰当调整了的VGG或者对部分变量进行再训练了的U-net,对大多数图像分类、探测或者分类问题来说是一个好的开头。
摆在你面前可供选择的基线模型还有很多!
到底选择哪个基线模型是由数据类型及任务目标决定的。比如,当你需要从各种特征值中预测房价时(即从一系列特征值中预测某个值),线性回归模型就比较合适,但如果是建造语音识别算法,这个模型就不太适用。在选择最适合的基线模型之前需要再三思考这个问题:你希望用这个模型得到什么?
三、为什么从基线模型开始?
从部署模型到获得结果的过程
部署一个模型并不轻松,在实施之前必须确保对这个模型足够了解。在项目开始时,优先级***的事项是预测未知风险。即使基线模型并不是终版模型,但是它能让你迅速迭代,从而降低不必要的时间成本。下面是支持这个论点的一些理由:
基线模型只会花费你少于十分之一的时间,却可以导出超过90%的结果。
把你的产出效率提高9倍!
举一个非常常见的例子:某团队希望找一个模型来预测用户点击广告的概率之类的问题。他们从一个逻辑回归模型开始,并在很短的时间内(在极少数的调整之后),准确率达到了90%。
那么问题来了:这个团队应该专注于把准确率提高到95%,还是用同样的方法,以90%的准确率解决别的问题?
绝大部分最为先进的模型都无法使错误率降低到零,原因在于它随机性的本质。虽然准确性和实际用例相关,但从本质上来讲,大部分系统的准确性都是各个部分准确值的乘积。
也就是说,***让10个连续的步骤准确性都达到90%,这样整体准确性就可以达到34%,而不是让1个步骤的准确性达到99%,而其他9个步骤都是10%,这样的整体准确性只有0.00000000099%%。
从一个基线模型开始,能让你首先清楚问题的瓶颈之处!
1. 基线模型让复杂模型陷入两难之地
通常情况下,你可以预估到使用各种模型可以达到的三种性能水平:
- 缺省可得性能水平是你希望任何一个模型都能达到的水平。举个例子,这个值可以是分类任务中出现频率***类别的概率值。
- 人类性能指标,是指一个人类完成任务的水平。计算机在某些任务中比人类表现好(例如AlphaGo),但在另外一些任务上表现差(例如创作诗歌)。人类完成一项任务的性能水平,能够作为标准协助对一个算法的表现形成合理预期,但是在不同领域,人类和电脑的表现可能大不一样,因此需要一些文献检索做校准。
- 可部署性能水平,即站在商业生产和可用性角度上,模型所需的最小准确值。通常情况下,这个值需要精细的设计决策系统才可得到。例如Google Smart Reply一般会返回三个建议决策,能够显著提高有用结果出现的概率。
上面我没有提到的一个标准,称之为“合理自动生成性能”,是指通过相对简单的模型可以得到的结果。通过这个重要的对标值,能够评估一个复杂模型是否表现良好,并且让我们不再在准确性与复杂性之间纠结。
很多时候,我们发现基线模型和复杂模型的表现相当,有时候基线模型的表现甚至可以超过复杂模型,在选择复杂模型前没有充分考虑基线模型的失败原因时更是如此。
除此之外,部署复杂模型也更加困难,这意味着在真正开始部署模型之前,程序员们首先还需要估计复杂模型比简单模型能提升多少。
2. 基线模型更容易部署
从定义上来说,基线模型很简单,一般由相对少的可训练参数组成,而且不需要太多的处理就可以迅速和数据匹配。
这个好处在真正开始编程时就会体现出来了:
- 训练迅速:能够迅速得到性能反馈。
- 更容易研究:这意味着遇到的大多数错误能够更容易定位是模型的缺陷,还是数据中的错误。
- 迅速推断:部署基线模型不需要太多架构层面的修改,并且不会导致潜在的风险。
一旦你创建并部署了基线模型,你已经处于下一步行动的***决策点了。
四、建造了基线模型之后呢?
也许是时候祭出研究文献了?
正如上文所提到的,基线模型会让你迅速得到性能对标结果。如果你发现它提供的性能值并不充分,那么找到简单模型难以解决的问题,你的下一步进展就会容易些。
譬如在NLP primer里,通过观察基线模型中的错误,我们发现模型没能把有意义的单词与虚词区分开。它可以这样指引我们通过模型抓取到类似的细微差别。
1. 基线模型能帮助你理解数据
如果选择的基线模型表现不错,那么你已经帮自己解决了建造复杂模型的大部分困难;反之,找出建造基线模型过程中的错误对于发现数据中的偏差与特定错误非常有建设意义。
许多阻拦机器学习进程的问题往往是因为没能理解和准备好数据,而不是选择一个更加复杂的模型。看看基线模型的不同表现对于你会有什么启发:
- 哪个类别更难分类:对于大多数分类问题,观察混合矩阵对于定位导致模型错误的类别非常有用。如果无论何时,基于一系列分类的模型表现都非常差,那么是时候深入分析数据、寻找原因了。
- 你的模型会选择什么作为信号:大多数基线模型都能够提取特征重要性,确定输入的哪个方面更加有预见性。分析特征重要性是了解模型的决策方式、潜在遗漏点的***途径。
- 你的模型会遗漏了什么信号:如果你的模型遗漏了数据中非常重要的方面,那么下一步***是手动加入这个特征,或者另选择一个能够更好利用数据的模型。
2. 基线模型能帮助你理解任务
除了能够更加了解数据之外,基线模型还能帮你了解哪部分内容比较难、哪部分比较简单。照此思路,你还能定位应该改进模型的哪个方面,从而更好地解决困难的部分。
例如,Bowen Yang在试图预测某个团队在Overwatch中获胜的几率时使用了逻辑回归模型。他很快注意到游戏半程之后,预测的准确性会大大提高。
这个发现帮他成功地选择了下一个建模方法,即一个从先验信息中了解到的技巧,让预测准确性在游戏开始***分钟之前就大大提高。
大多数机器学习问题都遵循“天底下没有免费的午餐”定理:不存在能够解决所有问题的方案。真正的挑战在于从各种架构中进行选择、决定恰当的策略、以及选择最适用于抽取及利用目标数据结构的模型。
再举一个例子,Chuck-Hou Yee试图对心脏的核磁共振成像进行分类时,是从最基本的U-net架构开始研究的。通过U-net架构,他注意到模型的很多分类错误都是由于缺少语境导致的。
为了解决这个问题,Chuck-Hou Yee另选择了膨胀卷积模型(dilated convolutions),极大改善了建模结果。
3. 什么时候不选择基线模型
***,对于有些任务来说,建造有效的基线模型的确很困难。如果你试图将一个录音中的不同人的说话内容分开(鸡尾酒效应),也许你得从一个复杂模型开始才能得到令人满意的结果。
在这类情况下,与其简化模型,采取简化数据的方法更加恰当。也就是说,让这个复杂模型过拟合现有数据集中的极小一部分。如果模型的表现能力够强,那这应该很简单;但如果表现能力差强人意,那么也许你需要试一试别的模型了。
鸡尾酒效应:https://en.wikipedia.org/wiki/Cocktail_party_effect
五、结论
人们都有一个倾向,如果有更加强大的解决方法,往往就会忽略掉简单的解决办法。但是在机器学习的大多数领域中,从基础开始往往更有价值。
尽管学着实施复杂模型确实有些难度,但机器学习工程师们***的挑战其实是如何给特定的任务选择建模策略。
先用一个简单模型可以很大程度上带来帮助;如果表现得不尽如人意,那么在采用更加复杂的模型时就可以避开在基线模型中已经发现的问题,从而达到更好的建模效果。
相关报道:
https://blog.insightdatascience.com/always-start-with-a-stupid-model-no-exceptions-3a22314b9aaa
【本文是51CTO专栏机构大数据文摘的原创译文,微信公众号“大数据文摘( id: BigDataDigest)”】