电子说
编者按:Insight Data Science AI负责人Emmanuel Ameisen分享了高效构建基于机器学习的产品的经验。
要构建通用AI,先掌握线性回归
从基本开始
试图发展对世界的科学理解的时候,大多数领域从粗略的勾勒开始,之后才探索重要的细节。拿物理来说吧,我们从简单模型(牛顿力学)开始,渐渐深入更复杂的模型(相对论),到时我们将知道,我们最初的假定是错误的。通过在最简单的有用层次推理,我们可以高效地解决问题,
所有事情都应该尽可能简单,但不要过于简单。
阿尔伯特·爱因斯坦
从非常简单的模型开始这一做法,同样可以应用于机器学习工程,通常可以证明,这是非常有价值的做法。事实上,我们在Insight看到数以百计的项目从想法到发布成品的全过程,发现从一个简单的基线模型开始,一贯地导向更好的最终产品。
应对复杂问题时,简单的方案,有很多缺陷:
它们有时候忽略输入的重要方面。例如,简单模型常常忽略句子中的词序,或者变量之间的相关性。
它们受到限制,难以得到精细的结果。大多数简单模型可能需要配合启发式方法或手工指定的规则才能供客户使用。
它们并不那么有趣,可能无法让你在开发时获得尖端研究的体验。
这些方案常常产生受到误导的输出,可能在我们看来非常愚蠢,正如本文标题所言,蠢模型。然而,如同我们将在本文中描述的,它们提供了极为有用的第一步,让我们可以更好地理解我们的问题,以找到最好的处理方法。正如George E. P. Box所说:
所有模型都是错误的,但有些模型有用。
换句话说:如果你想玩下有趣的玩意,从复杂的模型开始。如果你想解决问题、构建产品,从愚蠢的模型开始。
什么是基线?
不同的分布需要不同的基线(来源:xkcd/1725)
基线模型不仅易于配置,同时有合理的几率提供不错的结果。试验基线模型通常很快,而且代价较低,因为流行的软件包大多包括了基线模型实现。
值得考虑的一些基线:
线性回归。从一组特征预测连续值(价格、年龄等),首先尝试下线性回归。
逻辑回归。试图分类结构数据或自然语言时,逻辑回归通常能给出快速、牢靠的结果。
梯度提升树。Kaggle竞赛经典模型!从时序预测到一般结构数据,梯度提升树难以战胜。尽管比其他基线要稍微难以解释一点,它通常表现出色。
简单卷积架构。对大多数图像分类、检测、分割问题而言,微调VGG或再训练某个U-net变体通常是一个良好的开始。
还有更多!
简单基线模型的选择取决于要处理的数据类型和任务类型。如果你打算基于多个特征预测房价,那选择线性回归很合理。不过,如果你想要构建语音到文本算法,那选择线性回归就不怎么合理了。你需要思考你希望从基线模型中得到什么,以选择最佳的基线。
为什么从基线开始?
部署模型需要很多工作,确保提交前充分探索(来源:Uber)
开始一个项目时,首要的是了解会阻碍项目进度的未曾预见的潜在挑战。即使基线模型最终没有成为最终版本的模型,它们仍然能够让你非常快速地迭代,浪费最少的时间。下面是一些原因。
基线将花去不到1/10的时间,可能提供高达90%的结果
生产率乘以9!
这里有一个非常常见的故事:一个团队想要实现一个模型预测用户点击广告的概率。他们从逻辑回归开始,并很快(经过一些微调)达到了90%精确度。
问题在于:这个团队应该集中精力将精确度提高到95%,还是应该以这样90%的方式解决其他问题?
大多数最先进的模型,由于其随机性本质,仍然会给出非零误差率。你的用例可能不同,但大多数系统的效率本质上是乘法的,这意味着你宁愿选择90%精确度的10个连续步骤(导致34%的最终精确度),而不是一个99%的步骤,跟着九个10%的步骤(0.000000099%)。
从基线开始,让你可以首先解决瓶颈!
基线模型为更复杂的模型提供了上下文
通常,模型表现有三个易于评定的层次:
微不足道的可实现表现,你希望任何模型都能超过这个层次。例如,在分类任务中,每次都猜测最频繁出现的分类所得到的精确度。
人类表现,人类在这一任务上能够达到的表现。在某些任务上,计算机的表现比人类好很多(比如下围棋),在其他一些任务上,则比人类要差(比如写诗)。知道人类能够表现得多好,有时可以帮助你事先为算法设定期望。不过,由于人类/计算机在不同领域的任务上表现不一样,这也许需要进行一些文献检索加以校正。
部署模型要求的表现,从商业和可用性角度出发,使你的模型适宜部署到生产环境的最小价值。通常而言,聪明的设计决策可以让这一价值更容易实现。例如,Google的智能回复,显示三个建议回复,明显提升了显示有用结果的几率。
以上三个层次缺了一层,我会称它为“合理的自动化表现”,这代表可以通过一个相对简单的模型实现的表现。这对评估复杂模型是否表现良好而言,是不可或缺的,也能让我们处理精确性和复杂性的折衷。
许多时候,我们发现基线模型的表现和复杂模型相当,甚至优于复杂模型,特别是选择复杂模型时没有查看基线模型失败之处的时候。此外,复杂模型通常更难部署,这意味着,很有必要事先衡量它们在简单基线水平上的提升,是否值得额外的工程上的努力来部署它们。
简单模型易于部署
根据定义,基线模型是简单的。它们通常包含相对较少的可训练参数,无需太多工作就可以快速拟合数据。
这意味着,在工程上,简单模型:
训练起来更快,让你能够迅速得到模型表现的反馈。
研究充分,这意味着你碰到的大多数错误或者是构建模型时的简单bug,或者突显了你的数据有问题。
推理起来更快,这意味着部署它们不需要很多基础设施工程,也不会增加延迟。
构建和部署一个基线模型之后,正是决定下一步做什么的最佳时机。
构建基线模型之后做什么?
是时候拿一些论文出来看?
就像我们之前提到的那样,如果你发现基线模型的表现不够好,那么,查看简单模型失效之处有助于你找到更好的方法。
例如,在我之前写的NLP初步中,通过查看基线的误差,我们可以看到它无法区分有意义的单词和填充词。这引导我们使用可以捕捉这一细微差别的模型。
基线帮助你理解数据
如果基线表现良好,你就不用为配置一个更复杂的模型操心了。如果基线表现不佳,它产生的错误种类对理解数据的偏离和特定问题非常有指导性。大多数机器学习的问题是通过更好地理解和准备数据解决的,而不是通过选择更复杂的模型解决的。查看基线的表现有助你发现:
哪些分类更难区分。对大多数分类问题而言,查看混淆矩阵能得到很多关于哪些分类导致模型出现问题的信息。当特定分类上的表现特别差时,值得探索数据以理解为什么。
模型捕捉到了哪些信号。大多数基线可以提取特征重要性,揭示输入的哪些方法预测性最好。分析特征重要性对理解模型如何做出判定以及模型在哪些方面有所欠缺非常有帮助。
模型错过了哪些信号。如果数据的特定方面从直觉上看起来很重要,但模型忽略了它。那么进行特征工程或者选用其他能够更好地利用数据这一方面的模型会是一个好主意。
基线帮助你理解任务
基线不仅有助于你更好地理解数据,还能让你看到推理的哪一部分容易,哪一部分困难。进而允许你探索改进模型的哪个方向使困难部分表现更好。
例如,在尝试预测给定团队在守望先锋中的胜率时,Bowen Yang从逻辑回归开始。他很快发现在游戏过半之后预测精确度戏剧性地提升了。这一观察帮助他决定下一个模型的选择,一种允许从先验信息学习的嵌入技术,在一开始就提升了精确度。
大多数机器学习问题遵循“没有免费午餐”定理:并不存在一个万能的解决方案。从多种架构、嵌入策略、模型中选定能够提取和利用数据结构的最佳方案是一项挑战。查看简单的基线勉力建模的内容,对做出选择帮助很大。
再举一个例子。试图分割心脏MRI影像时,Chuck-Hou Yee首先尝试了一个原始的U-net架构。这让他发现模型产生的很多分割误差是因为缺少上下文信息(小型感受野)。为了应对这一问题,他转而使用了扩张卷积,这一选择显著提升了模型的表现。
当基线派不上用场的时候
最后,为某些任务构建有效的基线非常困难。如果你打算从音源中分离出不同的说话人(鸡尾酒会问题),你可能需要从复杂模型开始,以得到满意的结果。在这些情形下,作为简化模型的替代,你可以简化数据:尝试让你的复杂模型过拟合数据的一个非常小的子集。如果你的模型具备学习这一问题的表达能力,它会很简单。如果发现这部分很困难,那么通常这意味着你需要试试其他模型。
结语
当你意识到强大的模型的存在之后,很容易忽略那些简单方法。然而,和大多数领域一样,在机器学习中,从基本开始总是很有价值的。
学习如何应用复杂方法固然是一项挑战,机器学习工程师的最大挑战是为给定的任务决定建模策略。首先尝试简单模型可以为这一决策提供信息;如果简单模型的表现平平无奇,转而使用一个更复杂的模型,一个擅长避免基线产生的特定错误的模型。
在Insight,这一方法总共节省了数以千计小时的时间。我们希望这一方法对你同样有用。如果遇到问题,或有什么想法,欢迎留言!
全部0条评论
快来发表一下你的评论吧 !