過(guò)去兩年,機(jī)器學(xué)習(xí)書(shū)寫(xiě)了一卷強(qiáng)大的成長(zhǎng)史,無(wú)論你是否真的覺(jué)察,它都是如此直接且普遍地在我們的生活中體現(xiàn)價(jià)值:客服機(jī)器人、垃圾郵件過(guò)濾、人臉識(shí)別、語(yǔ)音識(shí)別、個(gè)性化推薦……機(jī)器學(xué)習(xí)和人的洞察力這對(duì)組合正逐漸滲透到各行各業(yè),使我們?cè)诿鎸?duì)這些冷冰冰的現(xiàn)代設(shè)備時(shí),享受到靈活、智能、且越來(lái)越富人情味兒的服務(wù)。
的確,神經(jīng)網(wǎng)絡(luò)、人工智能和機(jī)器學(xué)習(xí)沒(méi)什么新穎的,這些算法早在幾十年前就存在。但為什么這瓶老酒直到最近,才發(fā)酵出勢(shì)不可擋的香氣呢?數(shù)十億用戶每天行走于互聯(lián)網(wǎng)中,面對(duì)這巨大的行為數(shù)據(jù)體量,傳統(tǒng)統(tǒng)計(jì)分析方法已經(jīng)無(wú)力招架。圍繞著數(shù)據(jù)和工具發(fā)生的變化,可擴(kuò)展的計(jì)算能力在急劇上升,這些都推動(dòng)著機(jī)器學(xué)習(xí)以前所未有的方式大步向前。
除此之外,面向機(jī)器學(xué)習(xí)的可用框架也迎來(lái)了爆發(fā)式增長(zhǎng)。巨頭們紛紛將最為復(fù)雜的技術(shù)從機(jī)器學(xué)習(xí)中抽象出來(lái),開(kāi)源給開(kāi)發(fā)者和學(xué)術(shù)研究人員,在幫助更多人的同時(shí),使自身技術(shù)方案不斷得到完善和進(jìn)步。微軟也如是。
去年11月,微軟亞洲研究院將分布式機(jī)器學(xué)習(xí)工具包(DMTK)通過(guò)GitHub開(kāi)源。隨著某些應(yīng)用場(chǎng)景下數(shù)據(jù)量越來(lái)越大,分布式機(jī)器學(xué)習(xí)技術(shù)的重要性日益顯現(xiàn)。但將大量設(shè)備匯聚起來(lái)并開(kāi)發(fā)出能夠順利跨越各設(shè)備運(yùn)行的機(jī)器學(xué)習(xí)應(yīng)用絕非易事。大規(guī)模機(jī)器學(xué)習(xí)技術(shù)的挑戰(zhàn)在哪里?優(yōu)勢(shì)又是什么?對(duì)于開(kāi)發(fā)者,怎樣結(jié)合實(shí)際業(yè)務(wù)需求更好地使用DMTK?帶著這些問(wèn)題,51CTO記者走進(jìn)微軟亞洲研究院向DMTK團(tuán)隊(duì)研究員——微軟亞洲研究院主管研究員王太峰拋出了我們的疑問(wèn)。
微軟亞洲研究院主管研究員 王太峰
DMTK是什么
王太峰介紹,DMTK由一個(gè)服務(wù)于分布式機(jī)器學(xué)習(xí)的框架和一組分布式機(jī)器學(xué)習(xí)算法構(gòu)成,是一個(gè)將機(jī)器學(xué)習(xí)算法應(yīng)用在大數(shù)據(jù)上的工具包。DMTK目前聚焦于解決Offline-training的并行化。除了分布式學(xué)習(xí)框架,它還包括了主題模型和詞向量學(xué)習(xí)的算法,這些算法可以應(yīng)用于自然語(yǔ)言處理方面,比如文本分類(lèi)與聚類(lèi)、話題識(shí)別以及情感分析等。為了適應(yīng)不同的集群環(huán)境,DMTK框架支持兩種進(jìn)程間的通信機(jī)制:MPI和ZMQ。應(yīng)用程序端不需要修改任何代碼就能夠在這兩種方式之間切換。DMTK支持Windows和Linux兩種操作系統(tǒng)。目前主要支持C和C++,之后會(huì)考慮到一些高級(jí)語(yǔ)言的升級(jí),比如Python。
在實(shí)現(xiàn)算法的過(guò)程中DMTK團(tuán)隊(duì)看到,用一個(gè)框架來(lái)將這些算法很容易地并行到大量機(jī)器上來(lái)解決大規(guī)模機(jī)器學(xué)習(xí)問(wèn)題,是非常必要的。因此,微軟將DMTK框架和幾個(gè)例子開(kāi)源出來(lái),一方面與開(kāi)發(fā)者和學(xué)術(shù)研究人員共同分享技術(shù),另一方面希望通過(guò)大家貢獻(xiàn)改進(jìn)意見(jiàn),并將更多的算法添加到這套框架中來(lái)。
如何應(yīng)對(duì)大規(guī)模機(jī)器學(xué)習(xí)的挑戰(zhàn)
在被問(wèn)及DMTK如何解決大規(guī)模機(jī)器學(xué)習(xí)的挑戰(zhàn)時(shí),王太峰主要從如何處理大規(guī)模數(shù)據(jù)和訓(xùn)練大規(guī)模模型兩方面做了回答。
1. 大規(guī)模數(shù)據(jù):基于DMTK我們可以利用多個(gè)機(jī)器一同完成處理,每個(gè)機(jī)器處理一部分?jǐn)?shù)據(jù)。在多個(gè)機(jī)器中同時(shí)存在多個(gè)參數(shù)的副本,它們獨(dú)立基于本地?cái)?shù)據(jù)產(chǎn)生對(duì)參數(shù)的更新,并在參數(shù)服務(wù)器端進(jìn)行參數(shù)更新的合并。通過(guò)這種數(shù)據(jù)并行的方式,利用多個(gè)機(jī)器同時(shí)處理大規(guī)模的數(shù)據(jù),大大加速了學(xué)習(xí)過(guò)程。即使是每臺(tái)機(jī)器處理相對(duì)小的數(shù)據(jù)分塊,但是有時(shí)候模型參數(shù)非常多,以至于基于全部參數(shù)在內(nèi)存中更新的算法變得不可行。
2. 大規(guī)模模型:在大規(guī)模模型中,學(xué)習(xí)參數(shù)在單個(gè)機(jī)器中裝不下。就這個(gè)問(wèn)題,DMTK可以從兩個(gè)方面解決,首先DMTK框架中的參數(shù)服務(wù)器本身即為分布式,所以可利用很多機(jī)器分布式存儲(chǔ)模型。其次,在單個(gè)機(jī)器進(jìn)行本地學(xué)習(xí)的過(guò)程中,通過(guò)設(shè)計(jì)精巧的分段學(xué)習(xí)方法,使得參數(shù)更新分批次完成。即使模型再大,也能保證本地參數(shù)學(xué)習(xí)順利完成。
具體來(lái)說(shuō),DMTK當(dāng)前版本的工具包主要有以下幾個(gè)部分:
DMTK分布式機(jī)器學(xué)習(xí)框架
主要由參數(shù)服務(wù)器和客戶端軟件開(kāi)發(fā)包(SDK)兩部分構(gòu)成。
1. 參數(shù)服務(wù)器。重新設(shè)計(jì)過(guò)的參數(shù)服務(wù)器在原有基礎(chǔ)上從性能和功能上都得到了進(jìn)一步提升——支持存儲(chǔ)混合數(shù)據(jù)結(jié)構(gòu)模型、接受并聚合工作節(jié)點(diǎn)服務(wù)器的數(shù)據(jù)模型更新、控制模型同步邏輯等。
2. 客戶端軟件開(kāi)發(fā)包(SDK)。包括網(wǎng)絡(luò)層、交互層的一些東西,支持維護(hù)節(jié)點(diǎn)模型緩存(與全局模型服務(wù)器同步)、節(jié)點(diǎn)模型訓(xùn)練和模型通訊的流水線控制、以及片狀調(diào)度大模型訓(xùn)練等。用戶并不需要清楚地知道參數(shù)和服務(wù)器的對(duì)應(yīng)關(guān)系,SDK會(huì)幫助用戶自動(dòng)將客戶端的更新發(fā)送至對(duì)應(yīng)的參數(shù)服務(wù)器端。
通用分布式機(jī)器學(xué)習(xí)算法
LightLDA:LightLDA是一種全新的用于訓(xùn)練主題模型的學(xué)習(xí)算法,是具有可擴(kuò)展、快速、輕量級(jí),計(jì)算復(fù)雜度與主題數(shù)目無(wú)關(guān)等特點(diǎn)的高效算法。在其分布式實(shí)現(xiàn)中,DMTK團(tuán)隊(duì)做了大量系統(tǒng)優(yōu)化使得其能夠在一個(gè)普通計(jì)算機(jī)集群上處理超大規(guī)模的數(shù)據(jù)和模型。例如,在一個(gè)由8臺(tái)計(jì)算機(jī)組成的集群上,只需要一個(gè)星期左右的時(shí)間,可以在具有1千億訓(xùn)練樣本(token)的數(shù)據(jù)集上訓(xùn)練具有1千萬(wàn)詞匯表和1百萬(wàn)個(gè)話題(topic)的LDA模型(約10萬(wàn)億個(gè)參數(shù))。這種規(guī)模的實(shí)驗(yàn)以往在數(shù)千臺(tái)計(jì)算機(jī)的集群上也需要數(shù)以月計(jì)的時(shí)間才能得到相似結(jié)果。
分布式詞向量:詞向量技術(shù)近來(lái)被普遍地應(yīng)用于計(jì)算詞匯的語(yǔ)義表示,它可以用作很多自然語(yǔ)言處理任務(wù)的詞特征。微軟為兩種計(jì)算詞向量的算法提供了高效的分步式實(shí)現(xiàn):一種是標(biāo)準(zhǔn)的word2vec算法,另一種是可以對(duì)多義詞計(jì)算多個(gè)詞向量的新算法。
詞向量的作用是為了比較兩個(gè)詞之前的距離,基于這個(gè)距離來(lái)判斷語(yǔ)義上更深的信息。以前的詞向量模型以單詞為維度建立,每個(gè)單詞學(xué)出一組參數(shù),每組參數(shù)即為詞向量,每個(gè)單詞通過(guò)映射至詞向量上來(lái)進(jìn)行語(yǔ)義上的表達(dá)。一個(gè)向量在語(yǔ)義空間中對(duì)應(yīng)一個(gè)點(diǎn)。而一詞多義的現(xiàn)象極為普遍,但如果多個(gè)意思在語(yǔ)義空間中只用一個(gè)點(diǎn)來(lái)表達(dá)就不太科學(xué)。如果我們希望學(xué)出多個(gè)語(yǔ)義空間中的點(diǎn),在建立模型時(shí)就不會(huì)讓每個(gè)單詞只表達(dá)出一個(gè)向量,而是最開(kāi)始時(shí)就讓每個(gè)單詞選擇N個(gè)向量進(jìn)行定義,而后置入概率混合模型。這個(gè)模型通過(guò)在學(xué)習(xí)過(guò)程中不斷的優(yōu)化,產(chǎn)生對(duì)每個(gè)單詞多個(gè)向量的概率分布,結(jié)合語(yǔ)境對(duì)每個(gè)向量分配概率,從而學(xué)習(xí)更有意義的詞向量表達(dá)。
一詞多義的學(xué)習(xí)框架和學(xué)習(xí)過(guò)程與一詞一義并沒(méi)什么不同,但它有更多的參數(shù),并且需要在學(xué)習(xí)過(guò)程中分配多個(gè)向量各自對(duì)應(yīng)的概率,因此復(fù)雜度更高。由于整個(gè)過(guò)程通過(guò)多機(jī)進(jìn)行并行,因此還是能夠保證以足夠快的速度完成訓(xùn)練。比如在對(duì)某網(wǎng)頁(yè)數(shù)據(jù)集(約1千億單詞)進(jìn)行訓(xùn)練時(shí),8臺(tái)機(jī)器大概40個(gè)小時(shí)內(nèi)就可以完成模型訓(xùn)練。
DMTK提供了豐富的API接口給研發(fā)人員。大數(shù)據(jù)接口主要集中在并行框架這部分,來(lái)解決很多機(jī)器一起學(xué)習(xí)時(shí),單機(jī)的客戶端如何調(diào)用參數(shù)服務(wù)器的問(wèn)題。
王太峰為我們列舉了DMTK中對(duì)于不同需求的開(kāi)發(fā)者設(shè)計(jì)的API:
保持原有機(jī)器學(xué)習(xí)算法流程:這類(lèi)開(kāi)發(fā)人員最需要的API就是同步參數(shù),依照自己原有的算法進(jìn)行訓(xùn)練,只在需要多機(jī)之間交互時(shí)利用DMTK的API來(lái)獲取模型參數(shù)(GET)和發(fā)送更新(ADD)。通常這類(lèi)開(kāi)發(fā)需要花的精力比較少。 從頭設(shè)計(jì)算法:這類(lèi)開(kāi)發(fā)人員不需要設(shè)計(jì)完整算法流程,只需按照DMTK中對(duì)數(shù)據(jù)塊描述,接口會(huì)告訴DMTK每條數(shù)據(jù)需要什么參數(shù),如何利用數(shù)據(jù)進(jìn)行參數(shù)更新。DMTK客戶端SDK會(huì)自動(dòng)啟動(dòng)內(nèi)置的學(xué)習(xí)流程,進(jìn)行逐條數(shù)據(jù)的訓(xùn)練,并在必要的時(shí)候進(jìn)行模型交互。
目前DMTK在GitHub上有1400多顆星,在分布式機(jī)器學(xué)習(xí)的框架上來(lái)說(shuō)排名是非常靠前的。用戶也反饋了很多對(duì)代碼修復(fù)的意見(jiàn)、和對(duì)增加一些額外功能需求的建議。
DMTK并非完整的開(kāi)箱即用解決方案,其中分布式的算法,如LightLDA,WordEmbedding可以為很多用戶直接所用。同時(shí),DMTK在設(shè)計(jì)上允許用戶進(jìn)行后續(xù)擴(kuò)展,使其能夠支持更多的算法和平臺(tái)。王太峰還透露,目前DMTK還是利用現(xiàn)有的文檔系統(tǒng)(Filesystem),直接將數(shù)據(jù)分布在里面,各個(gè)機(jī)器處理本地硬盤(pán)上的數(shù)據(jù)。在此基礎(chǔ)上,DMTK正逐漸增加對(duì)Hadoop的一些支持,如利用HDFS去讀數(shù)據(jù),幫助用戶調(diào)度作業(yè)等。
后記
就在不久前,微軟公司還發(fā)布了另一套機(jī)器學(xué)習(xí)工具包,即計(jì)算網(wǎng)絡(luò)工具包(Computational Network Toolkit)——或者簡(jiǎn)稱(chēng)CNTK。另外,谷歌開(kāi)源人工智能系統(tǒng)TensorFlow,IBM開(kāi)源機(jī)器學(xué)習(xí)平臺(tái)SystemML。這對(duì)廣大開(kāi)發(fā)者和創(chuàng)業(yè)公司來(lái)說(shuō),無(wú)疑在很大程度上簡(jiǎn)化基礎(chǔ)技術(shù)的投入和難度。
大規(guī)模機(jī)器學(xué)習(xí)是一柄利刃,但決不是萬(wàn)能的。對(duì)于大規(guī)模機(jī)器學(xué)習(xí)領(lǐng)域來(lái)說(shuō),業(yè)務(wù)技術(shù)的重要性勝過(guò)基礎(chǔ)技術(shù)。這么多巨頭將機(jī)器學(xué)習(xí)平臺(tái)開(kāi)源,作為開(kāi)發(fā)者,我們?cè)贈(zèng)]理由不利用好。