随着人脸识别、搜索推荐、自动驾驶等方方面面的人工智能应用逐渐向人们靠近,人工智能与人类社会生活的融合程度也在逐渐提升,伴随着技术的发展以及算力的增强,可预见将来人工智能能做的事情将会越来越多,我们的生活与人工智能会更加密不可分。
那么在这场人工智能浪潮中,前端工程师们能在 AI 工程化方面做些什么事情呢?下面我们将根据业界已有的一些服务、平台还有我们自己的经验,来聊聊前端在这方面的工程经验。在此之前,先简单介绍一下机器学习是什么,它大概有哪些流程。
什么是机器学习?
--图片来自 pixabay,允许免费商用
机器学习的核心如果用一句话来概括,那就是根据已有的数据,采用特定的算法进行训练,得到可用于预测的模型。
在这句话里有三个关键词:数据、算法、模型。围绕这三个关键词我们进行展开:
数据
数据是机器学习的根本,无论是训练还是预测,都是围绕数据在进行的,因此必须先收集或记录大量的数据,然后才能做更多的事情。
有了可用的数据后,我们就要了解数据有哪些特征,特征需要被提前标注出来,然后算法工程师再从中发现或者创造出来一些可用的特征,围绕这些特征进行机器学习模型的训练。
以一个具体的例子来说,假设我们需要预测一单外卖订单的送达时间,我们首先需要获得以往记录下来的大量数据,之后还需要数据中的这些特征信息:下单时间、送餐地点、下单菜品种类和数据、餐厅的平均准备时间等,可以认为训练就是在找这些特征与我们的目标(预计送达时间)之间的关系,一个训练良好的模型,输入一条新的数据,能很好地实现我们的预测目标,然后在用户的手机里显示一个相对准确的预计送达时间。
算法
根据预测目的的不同,我们需要采用不同的算法来处理数据。预测目的从大类上来说,可以分为“监督学习”和“无监督学习”。
“监督学习”是指目标是已经注标好了,我们产生的模型获取到输入数据后,会按照给定的目标得出我们想要的结果,常见的监督学习解决的问题包括“分类”和“回归”:
分类的目标就是把结果分成几类,并给出属于每种类别的概率。典型的分类问题比如“二分类”,它的预测目的就是“是或否”,比如这一笔转账是否有风险,有风险的概率是多少。
回归的目标是根据输入预测输出结果的值,比如根据一个人的月消费种类和数量,推测出这个人的年收入是多少。
“无监督学习”是指目标并没有提前标注好,模型最终的目的并不是要得到某个值。典型的无监督学习解决的问题有“聚类”问题:
聚类的目的是把相似的数据聚在一起。比如推荐场景,聚类就可以把有相同兴趣爱好的用户划分在一起,然后给他们推荐这个群体需要或喜欢的内容。还有比如上面链接中指向的可以自动写作文的 GPT-3,也是属于无监督学习。
算法就是为了完成上述不同的目的,需要选择的对数据的处理方法,通过选择合适的算法进行训练来实现产出模型的目的。
模型
模型是机器学习训练的最终产物,它物理上对应的是一个文件,逻辑上对应的是一种模式,拿监督学习来举例,假设把所有的输入汇总看作是 x
,输出看作 y
,监督学习可以认为是在尽量寻找出 y ≈ f(x)
这个式子,其中的函数 f
就是训练得到的模型。我们最终就是利用这个模型,给它特定的输入,得到我们需要预测的结果。
在实际的工程实践中,这个模型文件并不会被业务团队直接使用,一般是将其部署在服务器上,上层对应着一个 API 可以调用这个模型做预测,业务团队最终通过调用 API 来使用模型的预测能力。
什么是机器学习平台?
简单介绍了机器学习是什么,有什么,接下来讲一下本文的重点 — 机器学习平台。
首先介绍一下为什么需要有机器学习平台,上面的机器学习简介和概括只提到了大体的流程,但一个机器学习模型从零到最终上线提供服务,中间还有很多工程和效率的问题需要解决,所以一般的公司都需要有一个或一些相关的平台来解决这方面的事情。
数据仓库
首先需要解决的是数据问题,数据会有不同的来源,有的是采集的,有的是业务记录的;数据的类型也不尽相同,有的是关系型数据,有的是 CSV,有的是对象存储;数据的规模也可能特别庞大,还需要专门的人员来维护大规模数据存取的问题。因此就需要有一个数据仓库,来把所有数据整合到一起,数据的存储和获取都在这一个地方进行,从而提升数据的存储和获取的效率,同时解决数据之间互相隔绝的问题。
标注平台
机器并不天生就理解它处理的数据,因此必须要提前赋予这些数据意义,比如要识别图片里的小狗,必须要先在训练数据集里把小狗标注出来,这样它才能理解什么是小狗。这里我们可以理解到,数据的标注是会影响到模型训练的效果的,数据标注的质量和数量越高,模型训练的效果也会越好,甚至标注本身还可能会成为突破模型关键指标的瓶颈,因此标注本身也具有足够的重要性,会需要有一个专门的标注平台来标注数据。关于数据标注具体要做什么,该怎么做,可以查看最下方"参考引用"里的文章。
特征平台
特征从字面上理解意思是“区分事物的关键”,事物的特征可以有非常多,比如有一篮水果,那么水果的颜色、形状、大小、重量等等都是不同的特征,如果想要统计篮子里大于 50g 的水果的数量,就只需要重量这一个特征就够了,颜色、形状、大小这些都可以不考虑。
实际的机器学习训练中,我们也需要把数据中符合我们目的特征选出来,其它和目的不相符的特征舍弃掉,此外还需要把互相相关的特征排除掉,实际的事情也往往没有像上面的选水果重量这么简单,因为很多特征不是直接可见的,我们需要对这些不显性可见的特征进行相关性选择、冗余排除,因此需要做特征的选取。
特征选取通常从两个方面入手:1. 特征是否发散,即这个特征是否独特,是否所有数据在这个特征上都相同或者相似;2. 特征与目的的相关性,相关性越高越有用。在这个过程中需要做大量的计算,结合数据和结果的可视化,最终选出我们需要的特征。
对于算法工程师来说,找出良好的特征,通常是模型训练过程中最难的一步,这一个环节费事费力,因此建立一个统一的特征库是很有用的,算法工程师们可以做特征的加工和录入以及更新,它可以解决特征的复用和共享的问题,并且随着特征库的不断更新的扩大,这笔特征的资产也会产生越来越多的价值。
模型训练平台
到这个阶段,所有的“原材料”就准备好了,那接下来算法工程师需要在哪里去利用这些原材料“炼出丹药”呢?可以肯定不会是在自己的工作电脑上,这样首先就会面临计算资源不足还有数据安全等问题,这时候模型训练平台就上场了,模型训练平台会作为一个与其它各个平台打通的角色,把模型训练前后的流程串起来,算法工程师可以在这里读取需要的数据,然后选择需要的特征,调整模型训练的参数,之后运行任务进行模型训练。
一般情况下具体的过程是:通过数据仓库提供的 SDK 读取数据,通过平台的数据可视化能力对数据做进一步分析,利用一些可视化或者非可视化的手段加工特征,选择完特征和配置完参数以后发起任务、训练模型、评估模型效果。
模型训练平台一般会提供一个 Web IDE 或者可交互式的编程环境给算法工程师,让他能够写代码完成工作,如果平台的标准化、自动化程度做得足够高,还可能会提供一个拖拉拽式的图形界面来帮助平台使用者串起整个模型训练流程,通过算法的封装和复用降低使用的门槛,用更加简单的方式实现模型训练。
模型服务平台
模型训练好、评估好以后,怎么才能最终投入使用、被业务团队调用呢?这就需要部署成一个可远程调用的服务,一般会有一个专门的模型服务平台,在这里上传模型文件,然后部署成一个可 HTTP 调用的 API,这个过程叫做模型服务的上线。模型上线之后,一般就会对这个模型服务进行监控,监控模型的调用次数、调用时间、调用结果等,确保模型服务的正常运行。随着外部环境的变化,模型的预测结果会发生漂移,此时就需要重新训练模型,然后在模型服务平台上升级线上的模型,更迭服务的版本。随着业务的变化,一个模型服务可能最终也会停止使用,这时候就可以到模型服务平台进行模型服务的下线。除此之外,模型服务平台一般还会拥有资源管理能力、服务熔断机制等能力来确保模型服务的稳定性和高并发。
前端能做什么?
上面说了这么多人工智能是什么,机器学习平台是什么,这一段进入我们的主题 — 前端工程师在这里面能做什么呢?基于我们的经验,我们认为大概有这些工作:
平台的产品化开发
上面提到的各种平台都会有 Portal 页或管理页,通常是大量的表单和列表,针对这些页面的产品化开发,前端可以想办法沉淀一些技术方案,例如 schema form,通用前端组件(例如 antd, pro-components)等,提升产品化页面的开发效率。
此外这些平台的业务往往会比较复杂,而且随着业务的发展将持续演进,因此前端代码的架构需要有足够的提前考虑,要设计出具有足够的可维护性的架构,并且能够渐进演进。
数据的埋点上报与分析
对于前端来说,有机会获取到用户在客户端的一些行为数据,可以将一些信息埋点并上报,为数据制造更多的来源,这里可以开发一些通用的前端埋点工具。
此外我们还可以基于这些数据做产品的优化,通过可视化的方式了解产品的运营情况,了解模块的使用情况等,辅助我们进行产品迭代的决策。
数据可视化
机器学习流程里充斥着数据,在这种到处是数据的场景下,数据分析和数据洞察能力的建设是前端工程师天然的输出点,围绕数据可视化,有许多工作可做可输出,例如通过可视化的方式快速了解数据的分布、通过可视化的方式进行模型效果的评估等。
在各种各样的可视化场景下,前端工程师需要根据业务需求,形成业务领域内可复用的可视化能力,同时还可以沉淀出底层的数据可视化解决方案。例如蚂蚁在业务中沉淀处理的可视化解决方案 - antv。
代码编辑器
模型训练的时候,需要编写一些简单的 SQL 以及 python 等语言的代码,这些场景下前端工程师需要提供代码编辑器,同时提供一些例如代码高亮、自动补全等能力。
编辑器本身,目前的主流选择一般是 Monaco Editor 或者CodeMirror,前端工程师需要在此基础上积累对应的技术经验,例如使用 TextMate 的语法进行代码高亮的定制。
云端开发环境
包括基于通用 Web IDE(theia, code-server)定制的机器学习专用 Web IDE,交互式编程环境(jupyter notebook)等。它们能通过云端服务,提供良好的开发体验,包括语言服务、自动补全、代码调试等,还有 jupyter notebook 的分步执行、分步调试、文档编写等各种便捷高效的服务和工具。
除此之外,这些云端开发环境往往不只需要关注浏览器端代码的开发,还需要关注开发环境后端的开发,同时编写 JS、Node、python 三端的代码,整体的代码量比较庞大,这需要了解或设计完整的云端开发环境前、后端架构,在设计良好的架构下才能支撑业务常规需求和快速迭代。
流程编排
机器学习的流程是相对固定和标准的,基于这种标准的流程做封装复用,自动化能力就可以大大提升,平台上的模型开发人员只需要通过可视化拖拉拽的方式进行简单的流程编排,再进行一些基本的配置和编写就可以完成模型的训练,模型开发人员的体验和效率都可以得到提升,并且也降低了开发的门槛。流程编排也是一个前端工程师可以发力的点,比如 antv 中的 x6 就是一个能解决这方面问题的图编辑引擎。
模型评估和模型可解释性
模型的评估指标,通过可视化的方式可以做更好的展示,让模型开发人员更直观地理解模型的效果。此外还可以通过可视化的方式展示跟踪模型训练的过程,帮助模型开发人员更好地理解模型训练的过程,追踪训练过程中的指标和数据随时间的变化,例如 TensorBoard。
模型服务的监控
模型服务上线之后,需要持续监控模型服务的效果和状态,这里也需要可视化的能力对各种监控指标进行展示和交互。业界比较出名的解决方案有Grafana 和 Kibana, 在蚂蚁内部也有相应的解决方案。
端智能
端智能是指把模型直接部署在客户端机器,通常是手机上,然后在手机 App 上直接以 SDK 的形式调用模型进行预测。端智能相比于部署在服务端来说,具有实时性好、节约服务端资源、隐私性好等特点,并且随着移动端的算力不断增强,模型压缩技术的不断成熟,端智能也正在打开新的局面和场景。
在端智能方向上,从数据到模型预测的链路比传统的模式要更长,端侧环境又更加复杂,因此这里也需要前端工程师来解决算法和工程协同的问题,这就要求前端工程师不止有丰富的端上开发经验,也需要有一定的算法功底,甚至对端上的机器学习框架(例如 TensorFlow.js)也有相当的研究,然后在端上做一些框架层的优化和应用层的落地。
以上就是我们根据业界现有的产品和服务,结合我们自己的经验看到人工智能领域内前端工程师可以做的事情,这篇文章是我们《AI 前端》系列文章的第一篇,主要起到一个概括和开头的作用,对于前端方面的工作做了些简单的介绍,后面我们将会持续深入“AI 前端”这个话题,结合讲述业界的产品、业务、技术,更细致地讲解前端工程师在人工智能领域所做的工作和创造的价值。
我们是蚂蚁金服体验技术部的数据智能团队,主要做的是人工智能工程化平台方面的事情,欢迎通过 beidao.zwt@antfin.com 与我们交流。