智联招聘网站建设,中山小程序开发公司,网站设计风格,网站建设和发布的一般流程图AI前线导读#xff1a;目前#xff0c;有很多深度学习框架支持与Spark集成#xff0c;如Tensorflow on Spark等。然而#xff0c;微软开源的MMLSpark不仅集成了机器学习框架#xff08;CNTK深度学习计算框架、LightGBM机器学习框架#xff09;#xff0c;还可以将这些计…AI前线导读目前有很多深度学习框架支持与Spark集成如Tensorflow on Spark等。然而微软开源的MMLSpark不仅集成了机器学习框架CNTK深度学习计算框架、LightGBM机器学习框架还可以将这些计算资源作为一种服务以HTTP服务的形式对外提供给用户。近日微软MMLSpark团队发表了一篇论文对MMLSpark的架构进行详细解读我们将基于这篇论文就MMLSpark的相关组件的特性和一个利用MMLSpark进行物体识别的案例展开介绍。本文是AI前线第55篇论文导读。微软开源MMLSpark机器学习生态系统旨在扩展Apache Spark分布式计算库以解决深度学习、微服务编排、梯度提升、模型可解释性等现代计算领域的问题。
微软针对Spark生态系统做了以下三个主要的贡献1将机器学习组件CNTK、LightGBM和Spark统一2集成了Azure 云端的Cognitive Services和实现了Spark的HTTP服务3部署所有的Spark计算作为一种分布式的web服务。
MMLSpark在算法和服务框架方面的优势
1、Deep Learning 方面
借助微软的Cognitive Toolkit(CNTK) 深度学习框架可以在Spark上做GPU加速。CNTK是类似Tensorflow、PyTorch、MxNet的深度学习框架可以帮助工程师和研究员解决各种机器学习问题还可以编写一些GPU加速代码。为了让Spark用户可以调用和训练CNTK模型我们在基于C语言实现的CNTK前提下对CNTK进行了简单的包装和接口的生成提供了Java的绑定。这样使JavaScala和其他基于JVM语言的用户对CNTK的可操作性大大增强。同时我们还为Spark transformers 自动生成了PySpark、SparklyR的绑定。在广播模型方面我们用Bit-Torrent 对其进行优化重新使用C对象减少垃圾回收开销异步处理mimi-batch数据、本地线程共享权重以减少内存溢出的问题。同时借助微软内部的预训练模型、工具可以做很多图像方面的工作包括野生动物识别、生物医疗实体抽取、加油站的火灾探测。
2、机器学习Gradient Boosting 、决策树方面
我们将微软开源的梯度提升算法库LightGBM集成到Spark里。LightGBM是一种现在非常流行且优秀的决策树算法框架。LightGBM on Spark 基于Message Passing InterfaceMPI进行通讯其通讯次数要比Spark ML自带的梯度提升算法库少很多因此LightGBM on Spark 比Spark ML的GradientBoosted Tree 训练速度快将近30% 。LightGBM 在训练过程中worker之间需要通讯为了统一Spark的API我们将控制转移到Spark的“MapPartitions”更具体的说是通过driver节点发送MPI 指令worker节点之间进行通讯来实现的。Spark和LightGBM的集成可以让用户很方便地创建各种分类、回归任务。
3、模型可解释方面
除了通过转换控制将框架集成到Spark中我们还扩展了SparkML的本地算法库其中一个例子就是 Local Interpretable Model Agnostic Explanations (LIME)的分布式实现。同时LIME提供了一种”解释“方式这种方式可以在不参考任何模型函数的情况下来解释任何模型的预测结果。更具体的说LIME通过一个抽样过程构造了一个局部线性近似的算法从而解释了黑盒子函数。
以图像分类为例局部遮挡会影响模型的最终输出那么则说明遮挡的这一部分对分类结果非常关键。更正式地说通过将图像随机块或将”超级像素“设置为中性颜色来创造大量扰动的图像然后将这些扰动的图像灌注给模型从而观察其如何影响模型的输出。 最后使用局部加权Lasso模型来学习超像素“状态”的布尔向量与模型输出结果之间的映射关系。
为了解释图像分类器进行图像分类的过程我们需要对成千上万的扰动图像进行抽样分析。更实际的说如果你的建模需要花费一个小时那么使用LIME计算来解释你的模型则需要大约50天。现在我们已经在Spark 上实现了LIME的分布式计算另外我们还选择了一种并行化的方案来加速每个单独的解释这可以说大大减少了计算时间。之后我们对输入图像进行超像素分解并将其并行化然后迭代这一过程从而为每一个输入图像创造一个新的并行化的“状态样本”集合。最后我们将一个分布式线性模型拟合到一个内部集合并将其权重添加到与原始并行的集合中。由于这种与以往不同的并行化方案使这一集成过程可以完全受益于快速编译的Scala和Spark SQL,而不是像工具Py4J那样把现有的LIME代码集成到Spark中。
4、网络和云服务方面HTTP和Cognitive 服务在 Spark上
通过Java Native Interface (JNI)和函数的dispatch将CNTK、LightGBM等机器学习组件和Spark 统一起来。考虑到涉及不同的系统编写这样的代码非常繁琐、复杂。现在我们借助微软内部开发的类似HTTP一样的协议来解决这个问题可以将HTTP的Request和Response转换为Spark SQL类型这样用户可以使用Spark SQL的map、reduce等算子来处理HTTP的请求和回应。微软的Cognitive Services、Kubernete都可以用这种方式来与Spark进行集成这样可以借助外部的智能服务让Spark的计算更智能。 每一个Congnitive Service就是一个SparkML的转换用户可以添加智能计算服务到自己的SparkML 工作流中。另外将每个请求的参数作为 dataframe中的一列做分布式处理对于处理大量的请求非常有帮助。
5、提供大规模实时的Web服务
MMLSpark集成了Spark ServingSpark Serving可以像调用Web服务那样使用Spark的计算资源。Spark Serving 建立在Spark Structured Streaming 之上可以通过Spark SQL编写相关任务的计算逻辑然后执行Streaming的查询。Spark Serving作为Structured Streaming的一种扩展是一项特殊的Streaming任务。这种Web服务更像是一种Streaming的pipeline首先通过HTTP请求原数据然后处理数据结果从而对外提供HTTP服务。 Spark Serving 可以部署Spark上的任何资源包括如CNTK、LightGBM、SparkML、Cognitive Services、HTTP Services等。这样可以让开发者不需要导出训练模型再花费时间使用其他语言编写对外提供的模型服务接口对开发者而言十分有效。
MMLSpark应用
目前MMLSpark支持大部分机器学习领域的常见问题包括文本、图像、语音。最近我们的研究者在无标注的情况下利用微软Bing的图像搜索功能和MMLSpark的图像识别功能完成了拍摄照片中雪豹的物体识别工作从而为保护野生动物雪豹提供了一个方案。
下面以雪豹物体识别的例子,来解释具体如何使用MMLSpark整体架构图第一步 收集数据
机器学习中最困难的部分是收集数据。传统的办法是人工标记人工标记数据耗费大量的时间和精力。没有高质量的标记数据集算法模型在实际应用项目中很难落地。现在通过微软的Bing图片搜索结果可以辅助我们标记大量的数据集这样就解决了人工标记耗时耗力的问题。Bing 图片搜索已经和Spark集成到一起了。雪豹在微软Bing图片搜索的结果基于Bing 图片搜索结果的数据集可以在Spark上创建各种应用。以收集雪豹数据集为例只需要两个Spark查询就可以完成数据集收集其中一个查询收集正样本雪豹相关的图片另外一个查询收集负样本随机图片。然后将结果数据集拉取到Spark集群通过Spark SQL做预处理比如添加标签、删除重复数据等。Spark在Azure集群上并行处理只需要花费几秒钟的时间就可以通过Bing搜索获取到世界各地的上千张图片。然后通过MMLSpark的OpenCV on Spark对图片进行快速处理。第二步 创建深度学习分类器
上一步数据集已经创建完成。下面开始构建模型卷积神经网络CNN是图像处理中比较流行的深度学习网络模型。为了构建深度神经网络可以借助MMLSpark上的Cognitive Service on SpakCNTK深度学习工具。迁移学习是目前比较流行的解决新任务的技术MMLSpark上做迁移学习任务非常容易。现在对于雪豹物体识别的新任务你不需要从零开始构建一个全新的网络结构只需要借助微软预先训练好的模型和借助迁移学习技术就可以解决这一问题。这个物体识别过程非常像人的思考过程是基于历史的记忆来学习、判断、和识别新事物。通过残差网络在数百万图片上训练的通用深度网络模型我们现在可以拿来使用只需要剪切最后几层网路结构并且使用Spark ML中的LR逻辑回归做替换构成新的网路结构。也就是说将前面几层网络输出的雪豹图片特征输入到逻辑回归最后输出的结果是雪豹的概率值。此外我们还可以借助LightGBM on Spark 在图片预处理方面做一些改进比如图像增强、数据不平衡处理等操作以提高最后识别的精确度。
第三步 利用LIME创建一个物体检测的数据集
上一步我们做了图片分类得到这个图片是雪豹的概率多大。但是在实际应用中我们更期望能得到雪豹在图片中的具体位置以便了解野外还有多少只雪豹。雪豹的数量对于保护雪豹至关重要。在Bing图片搜索中并没有给出雪豹的位置边框。在物体识别中识别的物体需要用边框框起来。传统的办法是人工来标注非常费力。根据上面介绍的LIME原理现在我们可以通过LIME的方法给要识别的物体标记上边框。如上图我们可以通过LIME的方法解释雪豹在图片中位置的特征对雪豹分类器非常重要那么我们就认为这个图片的这部分就是雪豹所在的图片位置然后我们用矩形边框将其框住。这样办法可以帮助我们快速建立非常丰富的带边框的物体识别数据集。
LIME计算会耗费大量的计算资源现在MMLSpark已经将LIME集成到Spark中这样可以借助Spark强大的分布式计算资源解决单机版本的计算瓶颈。
第四步 将LIME的知识应用于物体检测中
我们利用 Bing 图片搜索结果迁移学习技术和LIME方法快速完成了非常复杂非常耗时、耗精力的工作。下面我们开始使用COCO微软开源的物体识别数据集数据集预训练的模型结合迁移学习技术构建新的网路结构并进行模型训练。经过对比我们最后选用了Faster R-CNN网络和Inception Resnet v2网络它们结合起来在准确率、性能、速度方面目前是最优的。从最后识别结果来看跟人类标记非常接近。如下图所示在检测过程中我们也发现了一些问题比如下图中1、图片中真实的雪豹是两只我们的算法仅仅识别到一只2、有些雪豹隐蔽性很强我们的算法没有识别出来。造成上面结果的主要原因是1、在使用LIME进行边框标记是仅仅标记了一个边框2、收集数据集的时候Bing图片搜索中存在一些偏见比如Bing返回的图片结果都是高清的。
为了减少这些问题对结果的影响我们可以通过下面的办法来克服1、使用LIME方法标记物体框的时候对超高像素区域进行聚类算法以识别帧是否存在多个识别对象再添加标记边框2、在使用Bing搜索结果收集数据数据集的时候尽量通过随机结果多轮挖掘更多的正负样本。
第五步 部署模型以Web服务对外提供服务
MMLSpark将Web Serving组件集成到Spark中可以将上面训练好的模型部署到生产环境上给用户提供实时的查询服务。在MMLSpark v0.14的版本上延迟减少了近100倍现在可以在1毫秒内返回查询的相应结果可以为世界各地的用户提供查询服务。
第六步 最后实验效果
我们发现大多数的图像我们完全无监督的目标检测器绘制的边界框非常接近人类绘制的水平。下图表1和表2表明我们的方法可以逼近人类的分类效果和人类的物体识别能力。在物体检测方面无监督预训练模型的mAP值达到49.8超过了人类的30.9小于人类预训练模型的mAP值79.3。图像分类方面无监督的精确率为77.6%比人类的86.8%低但是高于人类LR(逻辑回归)的精确率65.6%。小结
MMLSpark提供获取数据源的途径Bing on Spark整合数据预处理(Spark SQL、模型训练CNTK on Spark模型输出对外提供服务Spark Serving等过程仅仅通过很少量的代码开发工作就可以完成非常复杂的应用。
我们总结一下常规的搭建一个应用的步骤
收集数据借助 Bing on Spark训练深度学习模型使用CNTK on Spark解释分类模型获取感兴趣的区域标注数据框借助 LIME on Spark借助迁移学习技术结合LIME的输出结果做物体检测部署模型对外给用户提供服务使用Spark Serving。
论文原文链接
https://arxiv.org/pdf/1810.08744.pdf
应用案例链接
https://blogs.technet.microsoft.com/machinelearning/2018/10/03/deep-learning-without-labels/