过去两年,机器学习书写了一卷强大的成长史,无论你是否真的觉察,它都是如此直接且普遍地在我们的生活中体现价值:客服机器人、垃圾邮件过滤、人脸识别、语音识别、个性化推荐……机器学习和人的洞察力这对组合正逐渐渗透到各行各业,使我们在面对这些冷冰冰的现代设备时,享受到灵活、智能、且越来越富人情味儿的服务。
的确,神经网络、人工智能和机器学习没什么新颖的,这些算法早在几十年前就存在。但为什么这瓶老酒直到最近,才发酵出势不可挡的香气呢?数十亿用户每天行走于互联网中,面对这巨大的行为数据体量,传统统计分析方法已经无力招架。围绕着数据和工具发生的变化,可扩展的计算能力在急剧上升,这些都推动着机器学习以前所未有的方式大步向前。
除此之外,面向机器学习的可用框架也迎来了爆发式增长。巨头们纷纷将最为复杂的技术从机器学习中抽象出来,开源给开发者和学术研究人员,在帮助更多人的同时,使自身技术方案不断得到完善和进步。微软也如是。
去年11月,微软亚洲研究院将分布式机器学习工具包(DMTK)通过GitHub开源。随着某些应用场景下数据量越来越大,分布式机器学习技术的重要性日益显现。但将大量设备汇聚起来并开发出能够顺利跨越各设备运行的机器学习应用绝非易事。大规模机器学习技术的挑战在哪里?优势又是什么?对于开发者,怎样结合实际业务需求更好地使用DMTK?带着这些问题,51CTO记者走进微软亚洲研究院向 DMTK团队研究员 —— 微软亚洲研究院主管研究员王太 峰抛出了我们的疑问。
微软亚洲研究院主管研究员 王太峰
王太峰介绍,DMTK由一个服务于分布式机器学习的框架和一组分布式机器学习算法构成,是一个将机器学习算法应用在大数据上的工具包。DMTK目前聚焦于解决Offline-training的并行化。除了分布式学习框架,它还包括了主题模型和词向量学习的算法,这些算法可以应用于自然语言处理方面,比如文本分类与聚类、话题识别以及情感分析等。为了适应不同的集群环境,DMTK框架支持两种进程间的通信机制:MPI和ZMQ。应用程序端不需要修改任何代码就能够在这两种方式之间切换。DMTK支持Windows和Linux两种操作系统。目前主要支持C和C++,之后会考虑到一些高级语言的升级,比如Python。
在实现算法的过程中DMTK团队看到,用一个框架来将这些算法很容易地并行到大量机器上来解决大规模机器学习问题,是非常必要的。因此,微软将DMTK框架和几个例子开源出来,一方面与开发者和学术研究人员共同分享技术,另一方面希望通过大家贡献改进意见,并将更多的算法添加到这套框架中来。
在被问及DMTK如何解决大规模机器学习的挑战时,王太峰主要从如何处理大规模数据和训练大规模模型两方面做了回答。
1. 大规模数据:基于DMTK我们可以利用多个机器一同完成处理,每个机器处理一部分数据。在多个机器中同时存在多个参数的副本,它们独立基于本地数据产生对参数的更新,并在参数服务器端进行参数更新的合并。通过这种数据并行的方式,利用多个机器同时处理大规模的数据,大大加速了学习过程。即使是每台机器处理相对小的数据分块,但是有时候模型参数非常多,以至于基于全部参数在内存中更新的算法变得不可行。
2. 大规模模型:在大规模模型中,学习参数在单个机器中装不下。就这个问题,DMTK可以从两个方面解决,首先DMTK框架中的参数服务器本身即为分布式,所以可利用很多机器分布式存储模型。其次,在单个机器进行本地学习的过程中,通过设计精巧的分段学习方法,使得参数更新分批次完成。即使模型再大,也能保证本地参数学习顺利完成。
具体来说,DMTK当前版本的工具包主要有以下几个部分:
主要由参数服务器和客户端软件开发包(SDK)两部分构成。
1. 参数服务器。重新设计过的参数服务器在原有基础上从性能和功能上都得到了进一步提升——支持存储混合数据结构模型、接受并聚合工作节点服务器的数据模型更新、控制模型同步逻辑等。
2. 客户端软件开发包(SDK)。包括网络层、交互层的一些东西,支持维护节点模型缓存(与全局模型服务器同步)、节点模型训练和模型通讯的流水线控制、以及片状调度大模型训练等。用户并不需要清楚地知道参数和服务器的对应关系,SDK会帮助用户自动将客户端的更新发送至对应的参数服务器端。
LightLDA:LightLDA是一种全新的用于训练主题模型的学习算法,是具有可扩展、快速、轻量级,计算复杂度与主题数目无关等特点的高效算法。在其分布式实现中,DMTK团队做了大量系统优化使得其能够在一个普通计算机集群上处理超大规模的数据和模型。例如,在一个由8台计算机组成的集群上,只需要一个星期左右的时间,可以在具有1千亿训练样本(token)的数据集上训练具有1千万词汇表和1百万个话题(topic)的LDA模型(约10万亿个参数)。这种规模的实验以往在数千台计算机的集群上也需要数以月计的时间才能得到相似结果。
分布式词向量:词向量技术近来被普遍地应用于计算词汇的语义表示,它可以用作很多自然语言处理任务的词特征。微软为两种计算词向量的算法提供了高效的分步式实现:一种是标准的word2vec算法,另一种是可以对多义词计算多个词向量的新算法。
词向量的作用是为了比较两个词之前的距离,基于这个距离来判断语义上更深的信息。以前的词向量模型以单词为维度建立,每个单词学出一组参数,每组参数即为词向量,每个单词通过映射至词向量上来进行语义上的表达。一个向量在语义空间中对应一个点。而一词多义的现象极为普遍,但如果多个意思在语义空间中只用一个点来表达就不太科学。如果我们希望学出多个语义空间中的点,在建立模型时就不会让每个单词只表达出一个向量,而是最开始时就让每个单词选择N个向量进行定义,而后置入概率混合模型。这个模型通过在学习过程中不断的优化,产生对每个单词多个向量的概率分布,结合语境对每个向量分配概率,从而学习更有意义的词向量表达。
一词多义的学习框架和学习过程与一词一义并没什么不同,但它有更多的参数,并且需要在学习过程中分配多个向量各自对应的概率,因此复杂度更高。由于整个过程通过多机进行并行,因此还是能够保证以足够快的速度完成训练。比如在对某网页数据集(约1千亿单词)进行训练时,8台机器大概40个小时内就可以完成模型训练。
DMTK提供了丰富的API接口给研发人员。大数据接口主要集中在并行框架这部分,来解决很多机器一起学习时,单机的客户端如何调用参数服务器的问题。
王太峰为我们列举了 DMTK中对于不同需求的开发者设计的API:
目前DMTK在GitHub上有1400多颗星,在分布式机器学习的框架上来说排名是非常靠前的。用户也反馈了很多对代码修复的意见、和对增加一些额外功能需求的建议。
DMTK并非完整的开箱即用解决方案,其中分布式的算法,如LightLDA,WordEmbedding可以为很多用户直接所用。同时,DMTK在设计上允许用户进行后续扩展,使其能够支持更多的算法和平台。王太峰还透露,目前DMTK还是利用现有的文档系统(Filesystem),直接将数据分布在里面,各个机器处理本地硬盘上的数据。在此基础上,DMTK正逐渐增加对Hadoop的一些支持,如利用HDFS去读数据,帮助用户调度作业等。
就在不久前,微软公司还发布了另一套机器学习工具包,即计算网络工具包(Computational Network Toolkit)——或者简称CNTK。另外,谷歌开源人工智能系统TensorFlow,IBM开源机器学习平台SystemML。这对广大开发者和创业公司来说,无疑在很大程度上简化基础技术的投入和难度。
大规模机器学习是一柄利刃,但决不是万能的。对于大规模机器学习领域来说,业务技术的重要性胜过基础技术。这么多巨头将机器学习平台开源,作为开发者,我们再没理由不利用好。
【责任编辑:Ophira TEL:(010)68476606】