入坑or退坑?机器学习从业者工作全解密

AI前线 2018-09-12 17:51
关注文章

导读:这几年机器学习越来越火了。但是,如果你真的跳进了机器学习这个坑,可能很快你就会发现,研发和部署机器学习系统相对来说,既快速又便宜,但是维护它们却很困难,而且成本昂贵。来自 fast.ai 的 Rachel Thomes 分享了一篇博文,给我们讲述了机器学习从业者实际上到底在做什么。

关于机器学习急缺人才的报道、以及公司声称自己的产品已实现机器学习自动化并无需机器学习专业知识的承诺,经常见诸报端。在 TensorFlow DevSummit 的主题演讲中,Google 的人工智能负责人 Jeff Dean 估计,有数千万家组织拥有可用于机器学习的电子数据,但缺乏必要的专业知识和技能。由于我在 fast.ai 的工作重心是让更多人使用机器学习并使其更易于使用,因此我密切关注这些问题。

在考虑如何使机器学习的一些工作实现自动化,以及如何使有着各自不同背景的人们更容易接触机器学习的技术,首选需要问的是,机器学习从业者到底是做什么的?任何用于解决机器学习专业知识短缺的解决方案都需要回答这个问题:我们是否只到应该教授什么技能,构建什么工具,或者将什么过程实现自动化。

构建数据产品是一项复杂的工作

虽然在学术上来说,许多机器学习资源几乎都是只关注预测建模,但这只是机器学习从业者日常所做的事情之一。适当地构建业务问题、收集和数据清洗、构建模型、实施结果,然后监控变化,这一过程在许多方面是相互关联的,往往很难通过单一部分就能满足(至少不知道其他部分需要什么)。正如 Jeremy Howard 在《Designing great data products》一文中提到的那样:出色的预测建模是解决方案的重要组成部分,但它不再是独立的存在;随着产品变得越来越复杂,它会消失在管道中。

一支来自 Google 的团队,成员 D.Sculley 等人撰写了一篇经典的文章:《Machine Learning: The High-Interest Credit Card of Technical Debt》(http://u6.gg/dR4e6),这篇文章讲的是关于在实践中使用机器学习时经常产生的代码复杂性和技术负债(technical debt)。作者在文章中,确定了一些系统级的交互、风险和反面模式(anti-patterns),包括:


AI 前线注: 技术负债(technical debt),比喻由漫无计划的软件架构,或者匆忙的软件开发引起的后果。又称为设计负债。1992 年,沃德·坎宁安首次将技术的复杂比作为负债。第一次发布代码,就好比借了一笔钱。只要通过不断重写来偿还负债,小额负债便可以加速开发。但久未偿还负债会引发危险。复用马马虎虎的代码,类似于负债的利息。整个部门有可能因为松散的实现,不完全的面向对象的设计或其他诸如此类的负债而陷入窘境。

反面模式(anti-patterns),在软件工程中,一个反面模式(anti-pattern 或 antipattern)指的是在实践中明显出现但又低效或是有待优化的设计模式,是用来解决问题的带有共同性的不良方法。它们已经经过研究并分类,以防止日后重蹈覆辙,并能在研发尚未投产的系统时辨认出来。


  • 粘合代码(glue code):编写大量的支持代码来将数据输入和输出到通用的包中。

  • 管道丛林(pipeline jungles):以机器学习友好的格式准备数据的系统可能会变成一堆充满碎片、联结部分以及采样步骤的丛林,通常带有中间文件输出。

  • 重复使用输入信号的方式会产生其他不相交系统的非预期紧耦合。

  • 外部世界的变化可能会使模型或输入信号以非预期的方式改变行为,而这些可能很难监控。

文章作者写道,真实世界中的机器学习工作的重要部分之一就是致力于解决这种形式的问题。值得注意的是,粘合代码和管道丛林是集合问题表现出来的症状,根源可能是“研究”和“工程”角色过于分离。学术界可能会惊讶地发现:许多机器学习系统中,只有一小部分代码用来进行“机器学习”。


AI 前线注: 粘合代码(glue code),亦称胶水代码。用途是粘合那些可能不兼容的代码。可以使用与搅合在一起的代码相同的医院编写,也可以用单独的胶水语言编写。粘合代码不识闲程序要求的任何功能,通常出现在代码中,使现有的库或者程序在外部函数接口(如 Java 本地接口)中进行交互操作。粘合代码在快速原型开发环境中非常高效,可让几个组件被快速集成到单个语言或者框架中。由于一个成熟的机器学习系统可能最终会包含(最多)5% 的学习代码和(最少)95% 的粘合代码,创建一个干净纯粹的解决方案比重复使用通用软件包成本要更低。

管道丛林(pipeline jungles)是粘合代码的一种特殊情况,经常出现在数据预备阶段。随着新信号逐渐被鉴定、新信息资源逐渐被添加,管道丛林也有机地发展起来。

当机器学习项目失败时

在之前的一篇文章中,我指出了一些机器学习项目在工作场所没有效果的失效模式:  


  • 数据科学团队构建了非常酷的东西,却从未被使用过。组织的其他成员对他们所做的工作并不买账,而且一些数据科学家对实际投入生产的东西也没有清楚的认识。

  • 数据科学家积压生产模型的速度远远快于将模型投入生产的工程支持。

  • 数据架构工程师与数据科学家是分离出来的。管道中并没有数据科学家们要求的数据,数据科学家们正在利用数据架构工程师收集的数据来源。

  • 公司已经确定了特性 / 产品 x。他们需要一个数据科学家来收集支持这个决策的一些数据。数据科学家觉得产品经理忽略了与决策相矛盾的数据;而产品经理却认为数据科学家忽视了其他业务逻辑。

  • 数据科学团队面试了一位数学建模和工程技能令人印象深刻的求职者。求职者一旦被录用,就会加入到需要简单业务分析的垂直产品团队中。数据科学家很无聊,因为在团队中,有杀鸡焉用牛刀的感觉。

在之前的文章中,我将这些视为组织上的失败,但也可以将它们视为各种从业者过度关注构成完整数据产品的复杂系统的一部分。这些是数据产品管道不同部分之间沟通和目标对齐的失败。

那么,机器学习从业者都做些什么呢?

如上所述,构建一个机器学习产品是一项多方面的复杂任务。以下是机器学习从业者在这个过程中可能需要做的一些事情:

 理解上下文:

  • 可以从机器学习中获益的业务领域

  • 与其他利益相关者沟通什么是机器学习,机器学习不具备的能力是什么 (通常有很多误解)

  • 了解业务战略、风险和目标,以确保每个人都达成共识

  • 确定组织拥有的数据类型

  • 适当地构建和审视任务

  • 了解操作约束 (例如,在推理时选出实际可用的数据)

  • 主动识别道德风险,包括性骚扰、猥亵、独裁政府滥用你的工作,或进行宣传 / 虚假宣传活动 (并计划如何减少这些风险)

  • 识别潜在的偏见和潜在的负反馈循环

 数据:


  • 制定计划收集更多不同的数据(如果需要及可能的话)

  • 将来自许多不同来源的数据拼接在一起:这些数据通常以不同的格式或不一致的惯例收集

  • 处理丢失或损坏的数据

  • 可视化数据

  • 创建合适的训练集、验证集和测试集

 建模:


  • 选择使用哪个模型

  • 将模型资源需求为约束条件(如,完成的模型是否需要在边缘设备上运行,是否在低内存或高延迟环境中运行等)

  • 选择超参数(如,在深度学习的情况下,这包括选择架构、损失函数和优化器)

  • 训练模型(并调试它为什么训练没有成功)。这可能包括:  

    • 调整超参数(如学习率)

    • 输出中间结果,查看损失、训练误差及验证误差是如何随时间变化的

    • 检查模型上错误的数据来查找模式

    • 识别数据潜在的错误或数据

    • 明确需要改变清洗和预处理数据的方式

    • 明确需要更多或不同的数据扩充

    • 明确需要更多或不同的数据

    • 尝试不同的模型

    • 确定数据是否欠拟合或过拟合

 产品化:


  • 创建一个 API 或 Web 应用,将你的模型作为端点以实现产品化

  • 将模型导出为所需的格式

  • 计划你的模型需多久一次使用更新的数据进行再训练(如,你可能会每晚或每周进行再训练)

 监控:


  • 跟踪模型的性能表现

  • 监控输入数据,以确定它是否随时间变化,从而使模型无效

  • 将结果转达给组织的其他成员

  • 指定计划,监督和应对错误和意外后果

当然,并非每个机器学习从业者都需要完成上述所有步骤,但这个过程的许多部分将是许多机器学习应用的一部分。即使你只是处理这些步骤的一部分,但熟悉过程的其余部分也有助于确保你不会忽视那些会使你的项目无法成功的注意事项!

机器学习中最困难的两个部分

就我自己和我所认识的许多人来说,我要强调机器学习(特别是深度学习)中,最耗时、最令人沮丧的两个方面是:

  1. 处理数据格式化、不一致和错误,通常是一个混乱、乏味的过程。

  2. 众所周知,训练深度学习模型是一个脆弱的过程。

 数据清洗真的是机器学习的一部分吗?是的!

处理数据格式化、不一致和错误通常是一个混乱且乏味的过程。有时候,人们将机器学习描述为独立于数据科学的过程,就像机器学习一样,你可以从已经精心清洗过的格式化数据集开始。但根据我经验,清洗数据集和训练模型的过程,通常是交织在一起的:我经常在训练模型中发现问题,就返回去更改输入数据的预处理。

 目前,深度学习模型的训练是脆弱且挑剔的

训练模型的困难程度之大,让许多初学者望而却步,他们常常感到灰心丧气。甚至专家也经常抱怨,训练模型的过程变化无常,实在令人沮丧。斯坦福大学的一位人工智能研究院告诉我,他所教的深度学习课程,让所有学生都做自己的项目,真是太难了。学生们无法让他们的模型进行训练,我们却说:“看,这就是深度学习。”Ali Rahimi 在 NIPS 颁奖演讲中,抱怨了模型训练的脆弱性。他是一名拥有超过 10 年的经验的人工智能研究员,获得了 NIPS 2017 Test of Time Award 奖。Rahimi 向人工智能研究人员的听众提问:“你们当中,有多少人从头开始设计一个深度网络,从零开始构建所有的东西,当它没起作用的时候,心情会感到槽糕?”很多人举起了手。Rahimi 继续说道:“这种情况啊,大概每三个月就会发生在我身上。”

即使是人工智能专家有时也难以训练出新模型这一事实意味着,这个过程并没有自动化,在某种程度上它应该可以被整合到通用的产品中。深度学习的一些最大进步将来自于发现更强大的训练方法。我们现在已经目睹了一些进步,像 Dropout、超收敛和迁移学习,所有这些使得训练变得更容易。通过迁移学习的力量,当为一个足够狭窄的问题域定义时,模型训练可以是一个健壮的过程;然而,我们仍然有办法让模型训练更加健壮。

给学术研究人员的话

即使你正从事机器学习理论研究,了解机器学习从业者处理实际问题的过程也是很有用的,因为这可能会为你提供有关最相关或最具影响力的研究领域见解。

Google 工程师 D.Sculley 等人写道,技术负债是工程师和研究人员都需要注意的问题。以大幅增加系统复杂性为代价来换取微小的精度优势的研究解决方案,很少是明智的做法。降低技术负债并不总是像证明新定理那样令人兴奋,但它是持续强劲创新的关键部分。为复杂的机器学习系统开发整体、优雅的决绝方案是非常有益的工作。

来自:AI前线(微信号:ai-front),作者:Rachel Thomas,译者:Sambodhi,编辑:Vincent

原文链接:http://www.fast.ai/2018/07/12/auto-ml-1/

评论
支持Markdown和数学公式,公式格式:\\(...\\)或\\[...\\]

还没有评论