机器学习的数据源和输入把机器学习看成是一个魔术黑箱是比较贴切的。进去的是数据;而出来的是预测。但是在这里没有什么魔法——只是数据和算法,以及通过算法处理数据所创建的模型。
如果您通过机器学习从数据中得出可操作的深度分析,那么就能搞清楚黑箱里面到底有什么。您越清楚箱子里到底有什么,就会越了解数据怎样转化为预测这一过程的每一步,您的预测就会越强大。
开发人员所说的“构建管道”是描述软件是怎样从源代码到部署实现的。当数据流过机器学习解决方案时,也会有一条管道。掌握管道怎样汇集到一起是从内向外了解机器学习本身一种有效的方法。
机器学习管道
正如维基百科研究分析师George Gilbert所描述的,机器学习管道由四个阶段组成:
1.输入数据
2.准备数据(包括数据探查和治理)
3.训练模型
4.服务预测
机器学习管道从两件事开始:要训练的数据和执行训练的算法。数据将以下列两种形式之一出现:
1.您已经收集和汇总的实时数据,您打算利用这些数据定期更新预测。
2.还有“冻结”的数据集,您下载并原样使用的数据,或者通过ETL操作从现有数据源派生出来的数据。
使用冻结数据,您通常只执行一类处理:您可以使用它来训练模型,部署模型,并根据需要定期更新模型(如果有的话)。
但是如果使用流数据,对于怎样从数据中生成模型和结果,您可以有两个选择。第一个选择是将数据保存在某个地方——数据库或数据湖,并在以后进行分析。第二个选择是在流数据输入时对模型进行训练。
流数据的训练也有两种形式,机器学习解决方案提供商BigML的Charles Parker对此进行了描述。一种情形是您在模型上应用最新的数据流进行预测,但是您并未调整底层模型。另一种情形是您获取的数据需要经常用来训练全新的模型,因为老的数据并不相关。
这就是为什么尽早选择算法是很重要的原因所在。一些算法支持增量再训练,而其他算法必须从头开始采用新数据重新训练。如果您一直在为自己的模型提供新数据,需要经常再训练,那么您会希望使用支持增量再训练的算法。例如,Spark Streaming支持这类增量再训练。
机器学习的数据准备
一旦您拥有了用于训练的一个数据源,下一步是确定它可以用于训练。描述所使用数据的一致性最合适的术语是规范化。
现实世界的数据会有很多噪声。如果它来自数据库,那么在那里会自动进行一定程度的规范化。但是很多机器学习应用程序也可能从数据湖或者其他异构源直接提取数据,如果是用于生产目的,它们的数据不一定要进行规范化。
《Python机器学习》的作者Sebastian Raschka在书中详细介绍了规范化,以及怎样针对某些常见类型的数据集进行操作。他使用的例子是以Python为主的,但基本概念是通用的。
是不是总是要进行规范化呢?麻省理工学院人工智能博士生Franck Dernoncourt在详细讨论堆栈溢出时指出,不总是。但正如他所说的,“不会有太大问题”。他认为,重要的是应用情形。对于人工神经网络,不一定需要规范化,但也是有用的;对于像K-means聚类等算法,归一化是非常重要的。
《从数据中学习》一书的作者之一 Malik Magdon-Ismail认为,当“数据规模太大”的时候,规范化就不是一个好主意了。一个例子:“在信贷审批中,如果要求收入是债务的两倍,那么收入两倍于债务是恰当的。”
在数据录入和准备阶段还要注意的是,怎样通过数据以及规范化后的数据,将偏差引入模型。机器学习中的偏差会产生实际的后果;这有助于知道怎样找到并消除可能存在的这种偏差。不要认为干净(可读、一致)的数据是没有偏差的数据。
训练机器学习模型
一旦建立了数据集,接下来就是训练过程,数据被用于生成可以进行预测的模型。
我之前提到的预测工作类型和使用的算法种类在这里很重要,具体取决于您是需要在批量数据上一次完成全部训练的模型,还是需要逐渐进行再训练的模型。而训练模型的另一个关键因素是怎样调整训练以提高最终模型的精度——所谓的超参数化。
用于机器学习模型的超参数是控制怎样从算法生成最终模型的一些设置。例如,K-means聚类算法以某种方式,根据彼此相似程度把数据组织成组。因此,K-means算法的一个超参数会是要搜索的聚类的数量。
通常,超参数的最佳选择来自于该算法的经验。有时,您需要尝试一些变化,看看哪些可以为您的问题集产生可行的结果。也就是说,对于某些算法实现,可以自动调整超参数。例如,用于机器学习的Ray体系架构具有超参数优化功能。
用于模型训练的很多库可以利用并行特性,通过把训练过程分布在多个CPU、GPU或者节点上来加速训练过程。如果您能够访问硬件,并行进行训练,那么请使用它。每增加一台计算设备,通常都能够以接近线性的方式进行加速。
用于进行训练的机器学习体系架构支持并行训练。例如,MXNet库可以让您并行训练模型。MXNet也支持并行训练的两种关键方法——数据并行和模型并行。
谷歌大脑团队成员Alex Krizhevsky在一篇关于并行化网络训练的论文中解释了数据并行与模型并行之间的差异。采用数据并行,“不同的员工在不同的数据实例上训练[模型] ...但是必须同步模型参数(或者参数梯度),以确保他们训练一致的模型。”换句话说,您把数据拆分到多个设备上进行训练,但必须确保生成的模型彼此保持同步。
采用模型并行,“不同的员工训练模型的不同部分”,但是当“由一个员工训练的模型部分需要由另一个员工训练的模型部分输出”时,员工必须保持同步。当训练模型具有彼此互相输入的多个层(例如递归神经网络)时,通常使用该方法。
应学习怎样使用这两种方法来组装管道,因为很多体系架构现在都支持这些方法,例如Torch体系架构。
部署机器学习模型
正如Gilbert在“机器学习管道:构建模块的中国菜单”文章中所述,管道的最后一个阶段是部署经过训练的模型,即“预测和服务”阶段。在这里,针对输入数据运行经过训练的模型,以产生预测。例如,对于面部识别系统,输入数据可以是头像或自拍照片,从别的脸部照片衍生的模型进行预测。
在哪里以及怎样进行这种预测构成了管道的另一部分。最常见的情形是通过RESTful API从云实例中提供预测。云服务的所有明显优势都体现在这里。例如,您可以调出更多的实例来满足需求。
采用云托管模型,您还可以将更多的管道保留在同一个地方——训练数据、训练过的模型和预测基础设施等。您不必四处移动数据,所以一切都更快。能够更快的完成模型的增量再训练,因为模型可以在相同的环境中进行再训练和部署。
但是,有时可以在客户端部署模型并从那里提供预测。这种方法比较好的应用是在移动领域,这一应用领域的带宽是非常重要的,适用于网络连接不能保证或者不可靠的应用。
值得注意的是,在本地机器上进行预测的质量可能不高。由于本地存储限制,所部署的模型规模可能较小,这会影响预测质量。在智能手机等适合的设备上部署高精度模型变得越来越可行,这主要是通过稍微牺牲一些精度,以提高速度来实现的。有必要看一看存在问题的应用程序,看看能否更好地在客户端上部署经过训练的模型,并定期刷新它,而不是通过远程API访问它。
还有另一种障碍:由于您可以在很多地方部署模型,因此,部署过程可能会很复杂。除非是逐个的部署应用程序,否则,从任何一个受过训练的模型到任何一个目标硬件、操作系统或者应用程序,都不会有一致的路径。尽管有越来越多的使用某种机器学习模型开发应用程序的实践活动,但是要找到一致的部署渠道还是有很大的压力,这种复杂性并不会很快消失。
机器学习管道并不是真正的管道
管道这一术语意味着从一端单向流动到另一端。在实际中,这种流动是有周期性的:数据进入,用于训练模型,然后随着新数据的输入,数据条件随之发生变化,对模型的准确性进行评估和再训练。
除了机器学习管道,除了需要专门关注的各个部分之外,现在我们没有太多的选择。不是因为每个阶段有不同的功能,而是因为所有组成部分的端到端集成方式还很少。换句话说,并没有管道,只是我们自己认为是管道的一系列活动。
但是项目正在汇集在一起,以满足实际管道这一 需求。例如,Hadoop供应商MapR有自己的“分布式深度学习快速入门解决方案”——把六节点一年许可的MapR Hadoop发行版,提供CPU/GPU支持的集成神经网络库,以及专业咨询服务结合在了一起。
理想的解决方案将是一个完整的开源设计模式,涵盖管道的每个阶段,并提供与现有软件连续交付系统的无缝体验。换句话说,像Wikibon的Gilbert所说的那样,它构成了“数据科学家的工具”。百度已经宣布正在为数据科学家寻找一种开发工具,其中,Kubernetes是主要因素(MapR还用于协调其系统中节点间的工作),但是还没有具体的实现。
在那一天到来之前,我们必须安排好由内而外的学习管道的方方面面。
Serdar Yegulalp是InfoWorld的资深作家,主要工作是InfoWorld技术观察新闻分析博客和定期评论。
原文网址: http://www.infoworld. com/article/3198252/ artificial-intelligence/ data-in-intelligence-outmachine-learning-pipelinesdemystified.html