機器學習算法及其並行化討論

http://www.thebigdata.cn/JiShuBoKe/13723.html

弄懂算法的核心,才知道能否並行

三、LDA和MapReduce——可擴展的基礎是數據並行

  因爲MPI在可擴展性上的限制, 我們可以大致理解爲什麼Google的並行計算架構上沒有實現經典的MPI。同時,我們自然的考慮Google裏當時最有名的並行計算框架MapReduce。

  MapReduce 的風格和MPI截然相反。MapReduce對程序的結構有嚴格的約束——計算過程必須能在兩個函數中描述:map和reduce;輸入和輸出數據都必須 是一個一個的records;任務之間不能通信,整個計算過程中唯一的通信機會是map phase和reduce phase之間的shuffuling phase,這是在框架控制下的,而不是應用代碼控制的。

  pLSA 模型的作者Thomas Hoffmann提出的機器學習算法是EM。EM是各種機器學習inference算法中少數適合用MapReduce框架描述的——map phase用來推測(inference)隱含變量的分佈(distributions of hidden variables),也就是實現E-step;reduce phase利用上述結果來更新模型,也即是M-step。

  但 是2008年的時候,pLSA已經被新興的LDA掩蓋了。LDA是pLSA的generalization:一方面LDA的hyperparameter 設爲特定值的時候,就specialize成pLSA了。從工程應用價值的角度看,這個數學方法的generalization,允許我們用一個訓練好的 模型解釋任何一段文本中的語義。而pLSA只能理解訓練文本中的語義。(雖然也有ad hoc的方法讓pLSA理解新文本的語義,但是大都效率低,並且並不符合pLSA的數學定義。)這就讓繼續研究pLSA價值不明顯了。

  另 一方面,LDA不能用EM學習了,而需要用更generalized inference算法。學界驗證效果最佳的是Gibbs sampling。作爲一種Markov Chain Monte Carlo(MCMC)算法,顧名思義,Gibbs sampling是一個順序過程,按照定義不能被並行化。

  但 是2007年的時候,UC Irvine的David Newman團隊發現,對於LDA這個特定的模型,Gibbs sampling可以被並行化。具體的說,把訓練數據拆分成多份,用每一份獨立的訓練模型。每隔幾個Gibbs sampling迭代,這幾個局部模型之間做一次同步,得到一個全局模型,並且用這個全局模型替換各個局部模型。這個研究發表在NIPS上,題目 是:Distributed Inference for Latent Dirichlet Allocation。

  上述做法,在2012年Jeff Dean關於distributed deep leearning的論文中,被稱爲data parallelism(數據並行)。如果一個算法可以做數據並行,很可能就是可擴展(scalable)的了。

  David Newman團隊的發現允許我們用多個map tasks並行的做Gibbs sampling,然後在reduce phase中作模型的同步。這樣,一個訓練過程可以表述成一串MapReduce jobs。我用了一週時間在Google MapReduce框架上實現實現和驗證了這個方法。後來在同事Matthew Stanton的幫助下,優化代碼,提升效率。但是,因爲每次啓動一個MapReduce job,系統都需要重新安排進程(re-schedule);並且每個job都需要訪問GFS,效率不高。在當年的Google MapReduce系統中,1/3的時間花在這些雜碎問題上了。後來實習生司憲策在Hadoop上也實現了這個方法。我印象裏Hadoop環境下,雜碎事 務消耗的時間比例更大。

  隨後白紅傑在我們的代碼基礎上修改了數據結構,使其更適合MPI的AllReduce操作。這樣就得到了一個高效率的LDA實現。我們把用MapReduce和MPI實現的LDA的Gibbs sampling算法發表在這篇論文裏了。

  當 我們躊躇於MPI的擴展性不理想而MapReduce的效率不理想時,Google MapReduce團隊的幾個人分出去,開發了一個新的並行框架Pregel。當時Pregel項目的tech lead訪問中國。這個叫Grzegorz Malewicz的波蘭人說服了我嘗試在Pregel框架下驗證LDA。但是在說這個故事之前,我們先看看Google Rephil——另一個基於MapReduce實現的並行隱含語義分析系統。

四、Rephil和MapReduce——描述長尾數據的數學模型

  Google Rephil是Google AdSense背後廣告相關性計算的頭號祕密武器。但是這個系統沒有發表過論文。只是其作者(博士Uri Lerner和工程師Mike Yar)在2002年在灣區舉辦的幾次小規模交流中簡要介紹過。所以Kevin Murphy把這些內容寫進了他的書《Machine Learning: a Probabilitic Perspecitve》裏。在吳軍博士的《數學之美》裏也提到了Rephil。

  Rephil 的模型是一個全新的模型,更像一個神經元網絡。這個網絡的學習過程從Web scale的文本數據中歸納海量的語義——比如“apple”這個詞有多個意思:一個公司的名字、一種水果、以及其他。當一個網頁裏包含”apple”, “stock”, “ipad”等詞彙的時候,Rephil可以告訴我們這個網頁是關於apple這個公司的,而不是水果。

  這個功能按說pLSA和LDA也都能實現。爲什麼需要一個全新的模型呢?

  從 2007年至今,國內外很多團隊都嘗試過並行化pLSA和LDA。心靈手巧的工程師們,成功的開發出能學習數萬甚至上十萬語義(latent topics)的訓練系統。但是不管大家用什麼訓練數據,都會發現,得到的大部分語義(相關的詞的聚類)都是非常類似,或者說“重複”的。如果做一個“去 重”處理,幾萬甚至十萬的語義,就只剩下幾百幾千了。

  這是怎麼回事?

  如果大家嘗試着把訓練語料中的低頻詞去掉,會發現訓練得到的語義和用全量數據訓練得到的差不多。換句話說,pLSA和LDA模型的訓練算法沒有在意低頻數據。

  爲什麼會這樣呢?因爲pLSA和LDA這類概率模型的主要構造單元都是指數分佈(exponential distributions)。比如pLSA假設一個文檔中的語義的分佈是multinomial的,每個語義中的詞的分佈也是multinomial 的。因爲multinomial是一種典型的指數分佈,這樣整個模型描述的海量數據的分佈,不管哪個維度上的marginalization,都是指數分 布。在LDA中也類似——因爲LDA假設各個文檔中的語義分佈的multinomial distributions的參數是符合Dirichlet分佈的,並且各個語義中的詞的分佈的multinomial distributions的參數也是符合Dirichlet分佈的,這樣整個模型是假設數據是指數分佈的。

  可 是Internet上的實際數據基本都不是指數分佈的——而是長尾分佈的。至於爲什麼是這樣?可以參見2006年紐約時報排名暢銷書The Long Tail: Why the Future of Business is Selling Less of More。或者看看其作者Chris Anderson的博客The Long Tail。

  長尾分佈的形狀大致如下圖所示:
這裏寫圖片描述
  
wangyi-2638202712

  其中x軸表示數據的類型,y軸是各種類型的頻率,少數類型的頻率很高(稱爲大頭,圖中紅色部分),大部分很低,但是大於0(稱爲長尾,圖中黃色部分)。一個典型的例子是文章中詞的分佈,有個具體的名字Zipf’slaw,就是典型的長尾分佈。而指數分佈基本就只有大頭部分——換句話說,如果我們假設長尾數據是指數分佈的,我們實際上就把尾巴給割掉了。

  割掉數據的尾巴——這就是pLSA和LDA這樣的模型做的——那條長尾巴覆蓋的多種多樣的數據類型,就是Internet上的人生百態。理解這樣的百態是很重要的。比如百度和Google爲什麼能如此賺錢?因爲互聯網廣告收益。傳統廣告行業,只有有錢的大企業纔有財力聯繫廣告代理公司,一幫西裝革履的高富帥聚在一起討論,競爭電視或者紙媒體上的廣告機會。互聯網廣告裏,任何人都可以登錄到一個網站上去投放廣告,即使每日廣告預算只有幾十塊人民幣。這樣一來,劉備這樣織蓆販屢的小業主,也能推銷自己做的席子和鞋子。而搜索引擎用戶的興趣也是百花齊放的——從人人愛戴的陳老師蒼老師到各種小衆需求包括“紅酒木瓜湯”(一種豐胸祕方,應該出豐胸廣告)或者“蘋果大尺度”(在搜索范冰冰主演的《蘋果》電影呢)。把各種需求和各種廣告通過智能技術匹配起來,就醞釀了互聯網廣告的革命性力量。這其中,理解各種小衆需求、長尾意圖就非常重要了。

  實際上,Rephil就是這樣一個能理解百態的模型。因爲它把GoogleAdSense的盈利能力大幅提升,最終達到Google收入的一半。兩位作者榮獲Google的多次大獎,包括Founders’Award。

  而切掉長尾是一個很糟糕的做法。大家還記得小說《1984》裏有這樣一個情節嗎?老大哥要求發佈“新話”——一種新的語言,刪掉自然英語中大部分詞彙,只留下那些主流的詞彙。看看小說裏的人們生活的世界,讓人渾身發毛,咱們就能體會“割尾巴”的惡果了。沒有看過《1984》的朋友可以想象一下水木首頁上只有“全站十大”,連“分類十大”都刪掉之後的樣子。

  既 然如此,爲什麼這類模型還要假設數據是指數分佈的呢?——實在是不得已。指數分佈是一種數值計算上非常方便的數學元素。拿LDA來說,它利用了 Dirichlet和multinomial兩種分佈的共軛性,使得其計算過程中,模型的參數都被積分給積掉了(integrated out)。這是AD-LDA這樣的ad hoc並行算法——在其他模型上都不好使的做法——在LDA上好用的原因之一。換句話說,這是爲了計算方便,掩耳盜鈴地假設數據是指數分佈的。

  實際上,這種掩耳盜鈴在機器學習領域很普遍。比如有個兄弟聽了上面的故事後說:“那我們就別用概率模型做語義分析了,咱們還用矩陣分解吧?SVD分解怎麼 樣?” 很不好意思的,當我們把SVD分解用在語義分析(稱爲LSA,latent semantic analysis)上的時候,我們還是引入了指數分佈假設——Gaussian assumption或者叫normality assumption。這怎麼可能呢?SVD不就是個矩陣分解方法嗎?確實傳統SVD沒有對數據分佈的假設,但是當我們用EM之類的算法解決存在 missing data的問題——比如LSA,還有推薦系統裏的協同過濾(collaborative filtering)——這時不僅引入了Gaussian assumption,而且引入了linearity assumption。當我們用其他很多矩陣分解方法做,都存在同樣的 問題。

  掩耳盜鈴的做法怎麼能存在得如此自然呢?這是因爲指數分佈假設(尤其是Gaussian assumption)有過很多成功的應用,包括通信、數據壓縮、制導系統等。這些應用裏,我們關注的就是數據中的低頻部分;而高頻部分(或者說距離 mean比較遠的數據)即使丟掉了,電話裏的聲音也能聽懂,壓縮還原的圖像也看得明白,導彈也還是能沿着“最可能”靠譜的路線飛行。我們當然會假設數據是 指數分佈的,這樣不僅省計算開銷,而且自然的忽略高頻數據,我們還鄙夷地稱之爲outlier或者noise。

  可是在互聯網的世界裏,正是這些五花八門的outliers和noise,蘊含了世間百態,讓數據不可壓縮,從而產生了“大數據”這麼個概念。處理好大數據 的公司,賺得盆滿鉢滿,塑造了一個個傳奇。這裏有一個聽起來比較極端的說法大數據裏無噪聲——很多一開始頻率很低,相當長尾,會被詞過濾系統認爲是拼寫錯 誤的queries,都能後來居上成爲主流。比如“神馬”,“醬紫”。

  Rephil 系統實現的模型是一個神經元網絡模型(neural network)。它的設計的主要考慮,就是要能儘量好的描述長尾分佈的文本數據和其中蘊含的語義。Rephil模型的具體技術細節因爲沒有在論文中發表 過,所以不便在這裏透露。但是Rephil模型描述長尾數據的能力,是下文將要介紹的Peacock系統的原動力,雖然兩者在模型上完全不同。

  Rephil 系統是基於Google MapReduce構建的。如上節所述,MapReduce在用來實現迭代算法的時候,效率是比較低的。這也是Peacock要設計全新框架的原動力—— 使其比MapReduce高效,但同時像MapReduce一樣支持fault recovery。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章