選擇一個(gè)機(jī)器學(xué)習(xí)(ML)庫來解決預(yù)測(cè)問題,是個(gè)說起來容易做起來難的事情。
選擇太多了。每一個(gè)庫對(duì)于它擅長的特定問題都有著良好的特性與優(yōu)勢(shì)。 即使對(duì)于在機(jī)器學(xué)習(xí)和數(shù)據(jù)科學(xué)領(lǐng)域具有相當(dāng)經(jīng)驗(yàn)的人來說,逐個(gè)檢查所有不同的方案也是一種煎熬。你該從哪里開始? 在Salesforce Einstein,我們必須不斷地研究市場(chǎng)以保持領(lǐng)先地位。 關(guān)于機(jī)器學(xué)習(xí)庫的前五重要的特征,以下是我們的一些觀察,開發(fā)者在決定使用哪個(gè)庫時(shí)可以參考。
1.編程范式
大多數(shù)機(jī)器學(xué)習(xí)庫,在高級(jí)設(shè)計(jì)模式中分為兩個(gè)模式:符號(hào)式(symbolic)和命令式(imperative)。
在符號(hào)式程序中,您可以從功能上定義復(fù)雜的數(shù)學(xué)計(jì)算,而無需實(shí)際執(zhí)行。它通常采用計(jì)算圖的形式。你把所有的東西放在一起,并用抽象的方式把它們連接起來,當(dāng)把真值作為輸入數(shù)據(jù)傳進(jìn)去時(shí),它才會(huì)真正實(shí)現(xiàn)計(jì)算。這種模式的最大優(yōu)點(diǎn)是可組合性和抽象性,從而使開發(fā)人員能夠?qū)W⒂诟邔哟蔚膯栴}。效率是另外一大優(yōu)勢(shì),因?yàn)閷⑦@些函數(shù)并行化執(zhí)行相對(duì)來說容易一些。
Apache Spark的ML庫,Spark MLlib以及任何基于Spark的庫,比如Microsoft的MMLSpark和Intel的BigDL,都遵循這種模式。有向無環(huán)圖(DAG)是計(jì)算圖的表示形式。符號(hào)式編程機(jī)器學(xué)習(xí)庫的其他例子有CNTK,具備靜態(tài)計(jì)算圖;Caffe2,使用網(wǎng)絡(luò)結(jié)構(gòu)類Net(操作符operator的計(jì)算圖);H2O.ai;以及Keras。
在命令式編程中,一切都是先執(zhí)行的。你寫下一行代碼,當(dāng)編譯器讀取這行并執(zhí)行它時(shí),就會(huì)發(fā)生真實(shí)的數(shù)值計(jì)算,然后移到下一行代碼。這種風(fēng)格使得創(chuàng)建模型原型更容易,因?yàn)樗`活,更容易調(diào)試,易于排除故障。 Scikit-learn是一個(gè)流行的Python庫,屬于這個(gè)類別。其他庫,如auto sklearn和TPOT是Scikit-learn的高階抽象層,也遵循這種范式。 PyTorch是另一種支持動(dòng)態(tài)計(jì)算圖的主流選擇,動(dòng)態(tài)計(jì)算圖讓整個(gè)計(jì)算流程是命令式的。
顯然,這兩種方法互有勝負(fù),究竟選擇哪種好,是隨著用例不同而不同的。命令式編程非常適合研究,因?yàn)樗烊恢С指焖俚脑驮O(shè)計(jì) —— 允許重復(fù)迭代,試錯(cuò)和和快速反饋循環(huán) —— 而符號(hào)式編程更適合于生產(chǎn)環(huán)境的應(yīng)用。
有一些庫結(jié)合了這兩種方法,創(chuàng)建了一種混合風(fēng)格。最好的例子是MXNet,它允許符號(hào)式編程中的回調(diào)函數(shù)中插入命令式代碼,或者把符號(hào)式編程作為命令式程序的一部分。另一個(gè)更新的發(fā)展是來自Google的TensorFlow的Eager Execution。盡管最初,它只是一個(gè)具備符號(hào)式計(jì)算范式的Python庫(一個(gè)張量的靜態(tài)計(jì)算圖),但是Eager Execution并不需要一個(gè)圖,而且可以立即執(zhí)行。
? 符號(hào)式:Spark MLlib,MMLSpark,BigDL,CNTK,H2O.ai,Keras,Caffe2
? 命令式:scikit-learn,auto sklearn,TPOT,PyTorch
? 混合式:MXNet,TensorFlow
2.機(jī)器學(xué)習(xí)算法
監(jiān)督學(xué)習(xí),無監(jiān)督學(xué)習(xí),推薦系統(tǒng)和深度學(xué)習(xí)是我們所采用的機(jī)器學(xué)習(xí)算法中常見的分類。我們需要再次強(qiáng)調(diào),應(yīng)用場(chǎng)景(用例)將決定使用哪個(gè)庫最好。例如,如果您正在進(jìn)行大量自定義的圖像處理,如果其他條件相同的話,Caffe2將是一個(gè)不錯(cuò)的選擇。它是Caffe的進(jìn)化版,Caffe一開始把CNN應(yīng)用于圖像分類。 CNTK將是自然語言處理的一個(gè)合理選擇,因?yàn)镃NTK框架誕生于微軟的語言服務(wù)部門。另一方面,如果大多數(shù)用例是監(jiān)督學(xué)習(xí)和非監(jiān)督學(xué)習(xí),Spark MLlib,scikit-learn,H2O.ai和MMLSpark也都是很好的選擇,因?yàn)樗鼈冎С执罅康谋O(jiān)督和非監(jiān)督算法。除此之外, Spark MLlib,H2O.ai和Mahout還通過提供協(xié)作過濾算法對(duì)推薦系統(tǒng)提供支持。
隨著深度學(xué)習(xí)(DL)的興起,許多較老的庫現(xiàn)在已經(jīng)顯得力不從心。 TensorFlow是首批向數(shù)據(jù)科學(xué)家提供深度學(xué)習(xí)的計(jì)算庫之一。今天,我們還有很多其他的專注于深度學(xué)習(xí)的框架可以選擇,其中包括PyTorch,Keras,MXNet,Caffe2,CNTK和BigDL。還有其他一些算法庫支持DL算法,但DL不是它們的主要功能,比如MMLSpark(用于圖像和文本學(xué)習(xí))和H2O.ai(通過deepwater插件提供對(duì)DL的支持)。
- 有監(jiān)督和無監(jiān)督:Spark MLlib,scikit-learn,H2O.ai,MMLSpark,Mahout
- 深度學(xué)習(xí):TensorFlow,PyTorch,Caffe2(用于處理圖片),Keras,MXNet,CNTK,BigDL,MMLSpark(用于處理圖片和文字),H2O.ai(通過deepwater插件提供支持)
- 推薦系統(tǒng):Spark MLlib,H2O.ai(通過Sparkling Water插件提供支持),Mahout
3.硬件和性能
計(jì)算性能是為您的項(xiàng)目選擇合適的庫的關(guān)鍵標(biāo)準(zhǔn)之一。這一項(xiàng)對(duì)于專精于DL算法的庫更為重要,因?yàn)樗鼈兺怯?jì)算密集型的。
推動(dòng)DL開發(fā)的最大趨勢(shì)之一是GPU的進(jìn)步,以及GPU提供了對(duì)大型矩陣運(yùn)算的支持。所有DL庫(如TensorFlow,Keras,PyTorch和Caffe2)都支持GPU,不過許多通用庫(如MMLSpark,H2O.ai和Apache Mahout)也提供了對(duì)GPU的支持。CNTK和MXNet擁有自動(dòng)化多GPU和多服務(wù)器支持,允許用戶進(jìn)行快速地進(jìn)行跨多個(gè)GPU的分布式訓(xùn)練,而且無需任何配置。然而,TensorFlow由于比其他的DL平臺(tái)計(jì)算速度慢,而得到了一些負(fù)面評(píng)價(jià)。作為一種彌補(bǔ),TensorFlow在其新的定制AI芯片Tensor Processing Unit(TPU)上大肆宣傳。其缺點(diǎn)是,TPU是非商品化的硬件,只能與TensorFlow一起工作,這導(dǎo)致了供應(yīng)商鎖定的現(xiàn)象。
Caffe2,MXNet和TensorFlow同時(shí)也因?qū)σ苿?dòng)計(jì)算支持而脫穎而出。所以,如果您的使用案例需要在移動(dòng)設(shè)備上進(jìn)行機(jī)器學(xué)習(xí)訓(xùn)練,那它們就會(huì)是你最好的選擇。
關(guān)于性能方面值得一提的是,大部分基于Spark構(gòu)建的庫都能夠依靠?jī)?nèi)存緩存中間數(shù)據(jù),靠這一點(diǎn)利用Spark進(jìn)行并行集群計(jì)算,使本質(zhì)上需要『迭代』的機(jī)器學(xué)習(xí)算法運(yùn)行得更快。 Apache Mahout是一個(gè)例外,它直到最近才支持Hadoop MapReduce,并且要進(jìn)行對(duì)計(jì)算而言開銷很大的磁盤I / O操作,因此它對(duì)于迭代算法來說速度較慢。 Mahout現(xiàn)在在Spark,H2O.ai和Apache Flink上增加了對(duì)Scala語言的支持。 BigDL在Spark的生態(tài)系統(tǒng)中使用CPU實(shí)現(xiàn)DL的方法是一種新穎的方式,與傳統(tǒng)的利用GPU加速的DL庫有所不同,BigDL使用英特爾的MKL和多線程編程。
- CPU:Spark MLlib,scikit-learn,auto sklearn,TPOT,BigDL
- GPU:Keras,PyTorch,Caffe2,MMLSpark,H2O.ai,Mahout,CNTK,MXNet,TensorFlow
- 移動(dòng)計(jì)算:MXNet,TensorFlow,Caffe2
4.可解釋性
ML軟件與傳統(tǒng)軟件的區(qū)別在于,其預(yù)測(cè)行為本身或產(chǎn)出的結(jié)果不是那么可預(yù)期的。與基于規(guī)則的引擎不同,這種軟件能不斷學(xué)習(xí)到新的規(guī)則。我們?cè)赟alesforce Einstein面臨的最大挑戰(zhàn)之一,是如何持續(xù)不斷地建立對(duì)機(jī)器學(xué)習(xí)應(yīng)用的信任和信心。為什么預(yù)測(cè)影響因子X有更高的可能性轉(zhuǎn)化客戶,而影響因子Y在轉(zhuǎn)化率方面引入的可能性較低?數(shù)據(jù)集中驅(qū)動(dòng)算法進(jìn)行某些預(yù)測(cè)的數(shù)據(jù)模式是什么?我們能否將機(jī)器學(xué)習(xí)模型的這種洞察力轉(zhuǎn)化為商業(yè)行動(dòng)?
對(duì)這個(gè)問題的其他衍生問題包括,計(jì)算圖執(zhí)行時(shí)對(duì)算法評(píng)價(jià)指標(biāo)的可視化,觀察數(shù)據(jù)流并對(duì)它們進(jìn)行優(yōu)化,手工模型和/或調(diào)試模型質(zhì)量。
這是一個(gè)在機(jī)器學(xué)習(xí)中相對(duì)不成熟的領(lǐng)域,只有少數(shù)庫試圖解決這個(gè)問題。 H2O.ai推出了機(jī)器學(xué)習(xí)可解釋性,解決了這個(gè)問題的某些方面。 TensorFlow有一個(gè)稱為TensorBoard的可視化工具,它幫助數(shù)據(jù)科學(xué)家理解、優(yōu)化和調(diào)試大量的深度神經(jīng)網(wǎng)絡(luò)。Keras也通過其自身的模型可視化解決了這個(gè)問題。
雖然這些都是朝著正確方向的很好的步驟,但是為了鼓勵(lì)ML被更廣泛的接納,可解釋性領(lǐng)域還需要我們投注更多的新學(xué),讓機(jī)器學(xué)習(xí)更加透明,減少它的黑盒性。
- 可解釋性:TensorFlow(TensorBoard),H2O.ai(機(jī)器學(xué)習(xí)可解釋性),Keras(模型可視化)
5.自動(dòng)化機(jī)器學(xué)習(xí)
可以這樣說:機(jī)器學(xué)習(xí)中最大的創(chuàng)新領(lǐng)域之一,就是自動(dòng)化的機(jī)器學(xué)習(xí)。真實(shí)世界中的機(jī)器學(xué)習(xí)不僅僅是構(gòu)建模型,還涉及到構(gòu)造數(shù)據(jù)管線,其中包括ETL,特征工程,特征選擇,模型選擇(包括超參數(shù)調(diào)優(yōu)),模型更新和模型部署。
工作流程中的許多步驟在各種應(yīng)用和數(shù)據(jù)集處理中都是通用的,并且往往有重復(fù)的傾向,這就意味著存在對(duì)流程進(jìn)行優(yōu)化和自動(dòng)化的機(jī)會(huì)。除此以外,某些工作流程特別需要數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)方面的直覺和領(lǐng)域知識(shí),比如特征工程或深度模型調(diào)優(yōu)。這些領(lǐng)域?qū)τ跓o法獲得博士學(xué)位的人來說難以進(jìn)入。實(shí)現(xiàn)許多步驟的自動(dòng)化,可以加快數(shù)據(jù)科學(xué)家的工作效率,能夠幫助他們?cè)趲讉€(gè)小時(shí)而不是幾個(gè)月內(nèi)幫助構(gòu)建機(jī)器學(xué)習(xí)應(yīng)用。
Auto sklearn,TPOT和H2O.ai就是建立在這個(gè)前提下的,而且針對(duì)的是有監(jiān)督分類問題。Auto sklearn使用了貝葉斯優(yōu)化進(jìn)行自動(dòng)化模型選擇和超參調(diào)整。 TPOT正在使用遺傳算法編程進(jìn)行超參調(diào)整。 TPOT和H2O.ai都包含了幾種不同級(jí)別的特征工程自動(dòng)化。 MMLSpark針對(duì)圖像和文本的特征,具備自動(dòng)化模型選擇,以及一定程度的自動(dòng)化特征工程。
無論是從廣度(數(shù)據(jù)管線中的不同階段自動(dòng)化)還是深度(單一一個(gè)數(shù)據(jù)處理階段上的智能自動(dòng)化)上,這類工具可以說是供不應(yīng)求。
- 超參數(shù)調(diào)整:auto sklearn(貝葉斯優(yōu)化),TPOT(遺傳編程)
- 有限的自動(dòng)特征工程:TPOT,H2O.ai,MMLSpark
其他注意事項(xiàng)
盡管機(jī)器學(xué)習(xí)模型在可用前需要在數(shù)據(jù)集上進(jìn)行訓(xùn)練,但是在某些情況下,我們可以訪問全球通用的數(shù)據(jù)集。比如,像ImageNet這種通用圖像數(shù)據(jù)集,完全足夠用于建立一個(gè)通用的圖像分類模型,這也被稱為預(yù)訓(xùn)練的模型。這樣的模型可以作為插件來引入,這意味著不需要數(shù)據(jù)或者訓(xùn)練。 MMLSpark,CNTK,TensorFlow,PyTorch,Keras和BigDL都為通用分類任務(wù)提供預(yù)訓(xùn)練的模型。值得注意的是,這樣的模型對(duì)于定制化用例是沒有用的。例如,一個(gè)通用的圖像分類模型,如果需要從作物田地的航拍圖像中對(duì)農(nóng)作物的類型進(jìn)行分類的話,效果就會(huì)很差,但是它能很好地將貓與狗分類。這是因?yàn)?,盡管ImageNet中存在農(nóng)作物相關(guān)的圖像,但是對(duì)于特定種類的作物,以及患上不同疾病的作物的訓(xùn)練數(shù)據(jù)是不足的,而那些數(shù)據(jù)可能剛好是化肥公司所關(guān)心的。
CNTK附帶一些方便的功能,如數(shù)據(jù)集自動(dòng)化隨機(jī)提取,以及實(shí)時(shí)在線訓(xùn)練。盡管MMLSpark是一個(gè)Scala庫,但它支持自動(dòng)生成其他語言,也就是Python和R的接口。
- 預(yù)訓(xùn)練模型:MMLSpark,CNTK,TensorFlow,PyTorch,Keras,BigDL
- 實(shí)時(shí)培訓(xùn):CNTK
- 多語言支持:MMLSpark支持從Scala自動(dòng)生成Python / R的接口
抉擇時(shí)刻
當(dāng)您將ML構(gòu)建到產(chǎn)品中時(shí),有多種ML庫供您選擇。盡管可能沒有一個(gè)完美的選擇,但考慮上述因素,有助于確保您為您的特定需求選擇最佳解決方案。對(duì)于擁有數(shù)千家企業(yè)客戶的企業(yè)公司來說,還有許多市場(chǎng)尚未涉足的其他挑戰(zhàn)。標(biāo)簽泄漏,也被稱為數(shù)據(jù)泄漏,一直是ML庫的致命弱點(diǎn)。這一點(diǎn)的發(fā)生是由于存在未知的業(yè)務(wù)流程,導(dǎo)致用于模型訓(xùn)練的數(shù)據(jù)集具有代表實(shí)際標(biāo)簽的字段。檢查數(shù)據(jù)是否存在泄漏,并將泄露的字段從數(shù)據(jù)中刪除是得到理想模型的關(guān)鍵。
多租戶是另一個(gè)關(guān)鍵點(diǎn) —— 我們?nèi)绾喂蚕頇C(jī)器學(xué)習(xí)平臺(tái)和資源,為多個(gè)用戶提供服務(wù),每個(gè)用戶都有自己獨(dú)特的數(shù)據(jù)集,并導(dǎo)致完全不同的模型被訓(xùn)練?隨著數(shù)據(jù)/模型規(guī)模的不同,這個(gè)問題也不同。隨著行業(yè)繼續(xù)面臨這樣的挑戰(zhàn),一個(gè)完整、詳盡開發(fā)的自動(dòng)ML解決方案,雖然現(xiàn)在暫時(shí)不存在,在將來可能被證明是成功的關(guān)鍵。
Mayukh Bhaowal
Mayukh Bhaowal是Salesforce Einstein的產(chǎn)品管理總監(jiān),負(fù)責(zé)自動(dòng)化機(jī)器學(xué)習(xí)。 Mayukh從斯坦福大學(xué)畢業(yè),獲計(jì)算機(jī)科學(xué)碩士學(xué)位。 在加入Salesforce之前,Mayukh在機(jī)器學(xué)習(xí)和分析領(lǐng)域的初創(chuàng)公司工作。 他擔(dān)任過機(jī)器學(xué)習(xí)平臺(tái)初創(chuàng)公司Scaled Inference的產(chǎn)品總監(jiān),該公司獲得Khosla Ventures的投資,曾在獲得Accel投資的電子商務(wù)創(chuàng)業(yè)公司Narvar擔(dān)任產(chǎn)品負(fù)責(zé)人。 他還曾經(jīng)擔(dān)任過雅虎和甲骨文的首席產(chǎn)品經(jīng)理。

