【Scala-ML】如何利用Scala構(gòu)建并行機器學習系統(tǒng)

引言

在學習Scala的過程中,我發(fā)現(xiàn)其在構(gòu)建大規(guī)模分布式計算系統(tǒng)上有與生俱來的特質(zhì)。其豐富的類型系統(tǒng)可以幫助編程設(shè)計提供很好的信息隱藏和抽象,其monoids和monads概念利用Scala高階函數(shù)實現(xiàn)計算并行和數(shù)據(jù)處理流水線,其Actor系統(tǒng)幫助編寫可伸縮性的應(yīng)用程序,其實現(xiàn)特定領(lǐng)域語言的優(yōu)勢幫助開發(fā)用戶很好克服不同語言的障礙。
雖然以上Scala優(yōu)點說起來不會感同身受,但這可以作為我學習的一大動力,讓我開始嘗試編寫并行機器學習系統(tǒng)。
在學習過程中,我主要參考《Scala for Machine Learning》一書和相關(guān)網(wǎng)上的資料。希望這些分享能幫助自己學習,也更好的服務(wù)有興趣的讀者。

為何使用Scala構(gòu)建機器學習系統(tǒng)

抽象

Monoids和Monads是函數(shù)式編程的重要概念。
Monoids定義了在具有閉包性質(zhì)(property of closure)的數(shù)據(jù)集上的二元操作op,恒等操作(identity operation)和結(jié)合性(associativity)。
下面是代碼描述:

trait Monoid[T] {
  def zero: T
  def op(a: T, b: T): T
}

Monoids具有結(jié)合性的操作。假設(shè)ts1、ts2、ts3是三個時間序列,該性質(zhì)保證ts1+(ts2+ts3) = (ts1+ts2)+ts3。Monoid的結(jié)合性對于計算流的并行化是很關(guān)鍵的。

Monads可以被認為是容器的結(jié)構(gòu),它是Monoids的推廣。像是Scala標準庫中的List,Map等集合被設(shè)計成monads的結(jié)構(gòu)。
Monads提供了以下的功能:1. 創(chuàng)建集合; 2. 對集合的元素進行轉(zhuǎn)換; 3. 壓平嵌套的集合。
下面是Scala代碼描述:

trait Monad[M[_]] {
  def apply[T](a: T): M[T]
  def flatMap[T, U](m: M[T])(f: T=>M[U]): M[U]
}

Monads允許集合或者容器連接起來產(chǎn)生一個工作流,該性質(zhì)可以應(yīng)用在任何科學計算中。

可擴展性

Actors系統(tǒng)使得Scala編程變得可伸縮、可擴展。Actors作為協(xié)程(coroutines),通過異步消息進行通信,管理底層的線程池。
機器學習的工作流被實現(xiàn)成一系列的計算任務(wù),這些任務(wù)包含了Scala的高階方法(如flatMap,map,fold,reduce,collect,join,filter)對數(shù)據(jù)集合的操作,Scala允許actors集群對這些數(shù)據(jù)進行分割來完成計算任務(wù)。Scala還支持本地或遠程的actor之間進行消息分發(fā)和消息路由。



上圖中,主節(jié)點作為控制器,管理和調(diào)度四步任務(wù)。這些具體的任務(wù)通過Scala的actors實現(xiàn)的多個工作節(jié)點執(zhí)行。主節(jié)點通過和工作節(jié)點交換消息來管理工作流的執(zhí)行狀態(tài),負責可靠性。通過監(jiān)督actors的層次結(jié)構(gòu)來實現(xiàn)計算任務(wù)的高可用性。

可配置性

Scala支持依賴注入(dependency injection),通過抽象變量(abstract variables)、自引用成分(self-referenced composition)和可堆疊的特質(zhì)(stackable traits)的組合來實現(xiàn)。最常用的依賴注入的模式成為cake pattern,該模式在構(gòu)建動態(tài)計算工作流中經(jīng)常用到。

可維護性

Scala內(nèi)嵌了領(lǐng)域?qū)S谜Z言(Domain Specific Languages,DSL)。DSLs是在Scala原生庫上建立的語法層,DSLs允許軟件開發(fā)者抽象計算細節(jié),更好讓使用者理解。DSLs最有名的應(yīng)用案例就是在Matlab中的語法形式。

計算工作流


一個計算工作流(computational workflow)可以分為以下幾個步驟:

  1. 從文件或數(shù)據(jù)庫中載入數(shù)據(jù)集
  2. 將數(shù)據(jù)集進行分割,用于并行的數(shù)據(jù)處理
  3. 運用過濾技術(shù)、方差分析等進行數(shù)據(jù)預(yù)處理
  4. 應(yīng)用機器學習模型

在使用訓練數(shù)據(jù)進行分析的過程還需要一些具體的處理:

  • 從清洗的輸入數(shù)據(jù)中選擇訓練集、測試集、驗證集
  • 抽取關(guān)鍵特征、利用聚類技術(shù)從一組相似觀測中簡歷親近關(guān)系
  • 減少特征數(shù)量,避免訓練數(shù)據(jù)過擬合
  • 重復(fù)進行多次上述步驟來驗證模型和調(diào)整模型
  • 將模型進行持久化,用于新觀測數(shù)據(jù)的預(yù)測和處理
  1. 評估模型表現(xiàn)

轉(zhuǎn)載請注明作者Jason Ding及其出處
Github博客主頁(http://jasonding1354.github.io/)
GitCafe博客主頁(http://jasonding1354.gitcafe.io/)
CSDN博客(http://blog.csdn.net/jasonding1354)
簡書主頁(http://www.lxweimin.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354進入我的博客主頁

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容