談談你對大規模機器學習這個領域的理解和認識?

海量數據場景下,通過大規模機器學習方法來充分挖掘數據集中的價值已經在很多公司里都有著非常多的應用了,相關的資料也已經很多,但是在我看來卻還談不上非常的系統,所以期望通過這個問題來一起把這個方向的知識體系梳理得更為清晰系統化,為有需要的同學提供一些導引性的幫助。


拋磚引玉。

感謝 @白剛 同學的回答,我的追加評論有些長,只能放在這裡了:
--------------------------------------------------------------------------------------------------------------
謝謝白剛同學的回答。
回答質量很高,留給我評論補充的餘地已經很少了:)。

我稍微再補充一點點自己的認識。

1. 大規模機器學習的知識構成。
本質上大規模機器學習可以說由三個Domain的知識構成
機器學習系統
並行計算
分散式系統
其中機器學習系統的由來已久,從單機版的liblinear/libsvm到MaxEnt以及MSRA開源出來的OWLQN實現,交大的SVDFeature到現在的Caffe以及TensorFlow(抱歉,目前的TensorFlow還是單機版的,所以雖然知道G家有將TensorFlow的分散式版發布出來的計劃,現在還是被我羅列在單機版的範疇了)。變化的是具體的演算法內核,線性模型/非線性模型,有監督學習/無監督學習,shallow model/deep model,不變的正如白剛同學所說的,是迭代求優的過程,PLSA和K-Means求解所使用的EM、LR模型求解所使用的LBFGS/OWLQN、Online Learning所使用的FTRL、Deep Learning慣用的SGD本質上都是迭代求優過程的不同演繹。
並行計算則由來更久,從7、8十年代就已經源起,彼時主要應用的領域還是偏窄一些,高能物理模擬計算/軍工/科學計算等等。
分散式系統相對來說要年輕一些,但也有十年左右的歷史。例子在這裡我想就不需要一一枚舉了。
不同的Domain對於大規模機器學習的貢獻是不一樣的。
在我看來,機器學習系統是大規模機器學習的內核,單機版的機器學習系統在很多場景下已經足以滿足業務需求,而並行計算在大規模機器學習的早、中期扮演了重要的角色(典型代表是MPI/Hadoop/Spark),隨著某些應用場景下數據量越來越大,分散式系統的技術知識也變得重要起來(典型代表是Petuum/Peacock)。

2. 大規模機器學習的核心本質論
說一門技術的」核心本質論「有些大言不慚的感覺,但是對」核心本質論「探討梳理的過程往往有助於我們更深入地理解掌握一門技術的核心精要,所以在這裡我只是share一下自己的理解認識,拋磚引玉。
在我個人看來,大規模機器學習的技術核心包括兩個層面的內容:
基礎技術
業務技術
其中基礎技術就是並行計算、分散式系統這樣的技術知識,而業務技術則是機器學習系統的知識。
所以,大規模機器學習也是一門業務,只不過這個業務更為基礎一些。
跟其他的業務領域一樣,整體意義上來說,業務技術的知識其實會要勝過基礎技術,但是這種對比關係又不絕對,很多時候基礎技術的知識又會對業務技術的演化帶來制約和決定性因素。我來試著舉幾個例子:
從我個人了解到的情況來看,已經有不少工業界的公司,當他們的大規模機器學習集群在使用Batch Learning演算法訓練LR耗時過長時,會使用FTRL來進行離線訓練,效果均跟Batch Learning演算法持平。這個業務場景其實對於基礎技術的選擇是有著蠻重要的影響的。不考慮FTRL,只是基於"embarassingly parallel"的暴力並行來進行batch learning演算法的性能加速,單位機器所帶來的模型收益是不會提升的。
另一個例子,就是LDA主題模型的分散式訓練了,從最傳統的Gibbs Sampling到Sparse Sampling再到去年MSRA和CMU合作發表的LightLDA,本質上還是在業務層面作了大量的優化,從而起到花費更少規模的機器,獲取評估數據集上相同甚至更高指標的效果。
而基礎技術的發展對業務技術的演化帶來促進的例子G家就是挺好的Case,只是做出一個分散式的機器學習系統和做出一個真正易用的機器學習系統,還是有著巨大的差異的,中間的差異主要還是由基礎技術與業務技術的緊密銜接帶來的。
但是我個人還是會認為,對於大規模機器學習領域來說,業務技術的重要性勝過了基礎技術。業務技術領域的創新和技術進展,在很大程度上可以簡化基礎技術的投入和難度。只有在限定業務技術問題場景的情況下,基礎技術的重要性會突顯出來。有過一定業務系統經驗的同學,對這一點的認識應該會有一些認識。

3. 大規模機器學習的業務技術剖析
白剛同學的答案里總結得很精鍊。
機器學習應用的問題,本質上包括兩個:
建模(representation)
求解(optimization)

大規模機器學習大抵上解決得還是求解這個維度問題的分散式實施。當然隨著數據量的增加,模型尺寸的變化,對於建模會提出新的要求,也許在建模環節有些許變化可以更有利於大規模分散式求解這又是另外一個story了(這裡我暫時沒想出好的例子,歡迎大家補充,也許word2vec的輸出層對softmax作的hierarchy優化算是一個蹩腳的例子?但是這個例子跟分散式求解似乎又不那麼強相關)

所以我會認為關於求解過程的技術知識對於大規模機器學習會更重要一些。
比如Find Local Minima的方法細分來說會有Trust Region和Line Search兩種。
前者是liblinear的主力求解演算法,後者在LBFGS或OWLQN求解演算法里會用到。
Line Search又細分為 Exact Step Size和Inexact Step Size兩類。
前者的代表是共軛梯度法,優化過程更為精確,但計算成本過高,通常不會被直接使用。後者的代表則是Backtracking Line Search。
不同的求解演算法,對應的並行化細節會有一定差異,雖然這種差異大抵上不是計算框架層面的差異,但只有精確地理解了這些差異以後才有可能在分散式實現中做到準確。

再比如EM演算法在PLSA求解演算法里的應用,對於E步和M步里要計算的那幾個條件
概率的求解過程的精確理解,可以讓我們 花費更少的計算代價完成統計計算,因為這些條件分布的具體數值是存在可以共用的部分的。

而建模對於大規模機器學習的重要性,固然對於深入理解分散式的實現細節有著重要的幫助,因為知識總歸是有聯繫的,建立起知識之間的聯接關係對於牢固把握肯定是有幫助,但更深層面的思考我目前還沒有得出,也歡迎大家補充。

4. 大規模機器學習的適用場景
總體來說,我的答案會比較中庸"it depends on"。是否應用大規模機器學習,使用什麼程度的大規模機器學習技術,跟具體的業務特點,數據規模是強相關的。
Deep Learning算是大規模機器學習的重度用戶,但是使用Deep Learning進行Query Understanding又未必一定需要大規模機器學習,單機多卡在很多場景下就足以滿足這樣以及類似的業務需要了。
搜索排序/推薦系統,我覺得就更是如此了,對業務問題的理解,對數據規律的認識,我個人認為重要性一定是優先於大規模機器學習系統本身的。當業務優化目標確定之後,數據量達到一定規模,這個時候就是大規模機器學習發揮空間的場景了。而到了這個階段,實際上也有不同的選擇,幾百GiB的數據,MiB級的模型?Spark/MPI是不錯的選擇。TiB級的數據,GiB級的模型?也許可以考慮一下PS這樣的架構。但是會不會數據可以通過Sampling達到相近的效果,模型可以通過精簡變得更為小巧?這些都是有大規模機器學習經驗的同學在應用之前值得ask自己的問題。手裡拿個鎚子,看啥都是釘子的事情還是要盡量減少。

當然,以上所說的場景還是偏主流業務導向的,對於push 技術邊界的場景,是不適合的。對於push技術邊界的場景,打造儘可能鋒利的技術尖刀,才更有助於探索技術邊界。

總的來說,大規模機器學習是一柄利器,但是這柄利器並不是萬能鑰匙,最本質的還是對我們要solve的那個問題的準確理解和定義。套用一句忘了哪個老哥說過的話:
搞清楚你真正的loss function是什麼才是最重要的事情。
---------------------------------------------------------------------------------------------------------------

自己最近也在整理關於大規模機器學習這個領域的一些經驗和思考,拋出來供大家一起討論,期望最終能夠作成一個open-source性質的系列文章。

Large Scale Machine Learning--An Engineering Perspective--目錄
Large Scale Machine Learning--An Engineering Perspective--0. 引言
Large Scale Machine Learning--An Engineering Perspective--1. 大規模機器學習平台的構成


機器學習研究的是從數據中自動的歸納邏輯或規則,並根據這個歸納的結果與新數據來進行預測的演算法。這個方向是與數據相關的,而從前數據的收集過程效率往往很低成本很高,很少有大規模的問題需要解決。直到互聯網發展起來,web伺服器可以記錄和收集大量的用戶訪問、交互信息,這類數據數據的收集成本非常低,並且有一定的價值。由此開始,「大規模機器學習」變得可行,並且越來越重要。

機器學習的應用上,我們接觸到的各種問題、演算法、技術看似複雜,但主要可以看成兩個方面:

  • 根據要建模的問題和應用的數據,確定模型的 representation 方案
  • 在representation的無限種可能中去尋找最優的模型的 optimization 方法

「大規模機器學習」所涉及的就是從模型的representation和optimization這兩個方面去解決應用大規模的數據時的理論和工程上的問題。

那麼我們先討論一下為什麼「大規模」是有益的,比「小規模」優勢在哪裡。

技術工作要以經世致用為則,而不是以fancy為則。
-- Who Who

模型訓練的目標是使得模型應用到新數據上時效果最好,也就是使得generalization error最小。而這個generalization error,對於supervised learning,理論上有兩個來源:bias和variance。High bias可以看做模型的建模能力不足,在訓練集上的錯誤較大--並且在新數據上往往會更差,也就是under-fitting;high variance則可以看做模型過於擬合訓練集,而對新數據會效果很差,也就是over-fitting。

所以對於模型效果上,除了特徵工程這類trick之外,「調得一手好參」--解決好bias和variance的tradeoff,也是部分演算法工程師的核心競爭力。但「大規模機器學習」可以一定程度上同時解決這兩個問題:

  • 解決high variance/over-fitting:增大樣本集。Variance的引入可以理解成樣本集不夠全面,訓練樣本的分布與實際數據的分布不一致造成的。擴大樣本集,甚至使用全量的數據,可以盡量使得訓練集與應用模型的數據集的分布一致,減少variance的影響。
  • 解決high bias/under-fitting:提升模型的複雜性。通過引入更多的特徵、更複雜的結構,模型可以更全面的描述概率分布/分界面/規則邏輯,從而有更好的效果。

所以當老闆/技術委員會/隔壁團隊的挑刺小能手/無知的圍觀群眾提出幾十上百計算節點/幾TB數據吞吐不夠綠色環保不要老想著搞個大新聞時,要以深邃的理論基礎兼可觀的業務收益說服眾人:經世致用,而不是追求fancy。

----------------

從模型的representation和optimization這兩個方面,更形式化的定義機器學習的求解問題,learning的過程大概可以這麼描述:

argmin_{vec{	heta} } equiv mathfrak{L} ( mathbf{D} ;vec{	heta} ) + Omega(vec{	heta})

其中vec{	heta}就是representation,或者說模型參數;mathbf{D}是數據;mathfrak{L}( ullet )Omega(ullet)分別是loss/risk/objective 和 prior/regularization/structural knowledge。

argmin_{vec{	heta} }的過程即前面說的optimization,往往是迭代優化的過程。有些可以轉化為最優化問題,通過數值優化的方法,比如batch的LBFGS,或者online的SGD/FTRL等等來進行參數估計;有些是無法構造成可解的最優化問題時,轉化為概率分布的估計問題,通過probabilistic inference來解決--比如用Gibbs sampling來訓練latent Dirichlet allocation模型。

無論是數值優化,還是sampling,都是不斷迭代優化的過程:

. . . vec{	heta}^{ 0} = initial   model
. . . for  i leftarrow 1  to   T
. . . . . .  Delta^{i} = mathfrak{g}(mathbf{D}, vec{	heta}^{ i-1})
. . . . . . vec{	heta}^{ i} = vec{	heta}^{ i-1} + mathfrak{u}(Delta^{i})

每一步迭代做兩件事。第一個是當前的模型vec{	heta}^{ i-1}在數據集mathbf{D}上的evaluation,得到一個「與好的模型相比可能存在的偏差」這個量;第二個是根據這個偏差量,去修正模型的過程。

大規模機器學習就是解決mathbf{D}vec{	heta}的規模非常大的時候所引入的理論上和工程上的問題。「知識體系」可以兩個方面來整理,一方面是宏觀上的架構,另一方面是無數微觀上的trick。迭代中的那兩個步驟決定了宏觀上的架構應該是什麼樣子。兩個步驟內的計算和之間的數據交互引入了解決多個特定問題的技術和trick。

首先,mathbf{D}vec{	heta}需要分布在多個計算節點上。

假設數據分布在n個data node節點上;模型分布在m個model node節點上。數據/樣本集只與第一步有關,這部分計算應該在數據所在的節點上進行;第二部是對模型的更新,這一步應該在模型所在的結點上進行。也就是說,這個架構中有兩個角色,每個都有自己的計算邏輯。並且在分散式的系統中,需要有一套replica的機制來容錯。

幾乎所有的大規模機器學習的平台、系統都可以看做這由這兩個角色構成。在Spark MLLib裡邊,driver program是model node,executor所在的worker node是data node;在Vowpal Wabbit裡邊,mapper id為0的節點扮演了model node的角色,所有的mapper扮演了data node的角色;在Parameter Server(Petuum, DMLC)里,server是model node,worker是data node。其中MLLib和VW的model node都是單個結點,而PS可以把模型擴展到多個結點。

其次,節點間需要傳輸數據。data node需要在計算前先獲取當前的模型 vec{	heta}^{ i-1} ,model node需要得到更新量Delta^{i}

MLLib通過RDD的treeAggregate介面,VW通過allReduce,這兩者其實是相同的方式。結點被分配在一個樹狀的結構中,每個節點在計算好自己的這部分更新量 Delta^{i}_k後,匯總它的子節點的結果,傳遞給它的父節點。最終根節點(model node)獲取到總的更新量Delta^{i} = Sigma_k Delta^{i}_k。DMLC中的Rabit對這類aggregation數據傳輸提供了更簡潔的介面和更魯棒的實現。我們應用Rabit實現了一套multi-task learning去訓練不同廣告位上的廣告點擊率模型的方案。

而PS則是通過worker(data node)去pull其需要的那部分 vec{	heta}^{ i-1} ,計算更新量並把自己的那部分Delta^{i}_k去push給server(model node),server去做對應的模型的更新。這個似乎比前邊的aggregation要簡單,但當每個data node進度差別太大時,又引入了新的問題。

所以第三點問題涉及到並行和一致性。分散式的系統中每個節點的狀態都不相同,計算的進度也會不一樣。當某個data node計算的更新量Delta^{i}_k對應的是若干輪迭代之前的 vec{	heta}^{ i-n} 時,它對優化不一定有貢獻,甚至可能影響到收斂。

VW和MLLib上的迭代計算,可以看做是同步的。所有的model node獲取了所有的data node的Delta^{i}_k匯總起來,再更新vec{	heta}^{ i},並廣播給所有的data node。每次迭代model node獲取的是完整的更新量,data node拿到的是一致的模型。所以這裡相當於設置了barrier,等大家都到達這一輪的終點時,再放大家開啟下一輪。

這裡的tradeoff是:完全不設置barrier,也就是純asynchronous processing,會讓系統儘快的推進下去,但節點間進展程度差異太大會造成優化求解的收斂性不穩定;每一輪迭代都設置barrier,也就是bulk synchronous processing,會保證數據的一致,但是會在每一輪都等待慢的節點,造成效率不足的問題。

所以一個折衷的方案就是設置barrier,當不是每一輪都設置,而是限定一個時間窗口長度	au。計算的最快的節點也要等到所有的Delta^{i-	au}_k都被應用到 vec{	heta}^{ i-	au} 的更新之後再開始下一輪pullcomputepush。這種機制又叫bounded delay asynchronous或者stale synchronous processing。

總的來說,解決好以上的幾個問題,構建一套大規模的機器學習系統並不是太空科技。但這些需要嚴謹的工程能力和大量的巧妙的trick。這些都來自於對問題的深入理解和探索,以及充分的實踐。前者幫助更合理的抽象結構、定義介面,後者則幫助解決實現中的障礙,得到更高效和穩定的系統。

我曾經嘗試在Apache Spark上去實現一些大規模的機器學習演算法(https://github.com/BaiGang/spark_multiboost),並逐漸的發現Spark RDD這種data flow的抽象方式雖然可以支持機器學習演算法實現上的一些需求,但它過於高級的介面封裝限制了更底層的更有針對性的優化。

我後來也參與了一套分散式計算框架以及在其上的機器學習演算法的開發(https://github.com/taskgraph/taskgraph)。Go lang有不錯的支持並行計算和網路的介面,很適合作為系統編程語言。但進行密集的純佔用CPU的數值計算時--機器學習演算法程序的普遍情形--其性能還是有一定的差距。我想隨著Go不斷推出優化的新版本,TaskGraph仍然值得深入去做。

所以大規模機器學習的系統或平台應該是具有這樣的特性:

  • 較高的CPU、內存和網路性能
  • 較靈活的模塊抽象與介面
  • 能夠與現有的平台、工具、生態系統兼容

綜合這幾點,現有的若干種針對大規模機器學習的開源工具中,DMLC是值得使用的一個。

  • 性能:由c++實現,引入大量的c++11特性來提升效率和增強代碼可讀性
  • 模塊抽象與介面:由若干個庫組成
    • rabit(https://github.com/dmlc/rabit)實現了allreduce介面
    • ps-lite(https://github.com/dmlc/ps-lite)實現了parameter server,並包含大量工程上的優化和trick
  • 結合現有生態系統:通過dmlc-core(dmlc/dmlc-core · GitHub)這個庫來支持
    • YARN資源管理,可以直接在現有的Hadoop 2.0+/Spark集群上去運行
    • HDFS/S3等分散式文件系統的介面,可以直接讀取現有的Hadoop集群上的數據,與ETL過程無縫的接合

-----------------

大規模的機器學習,看似fancy,實際卻是由一些常規的理論和基礎支撐起來的。其真正發揮作用是在擁有大量的數據複雜而有價值的業務的情況下。


這個問題問地太大了,我結合自己幾年工作中的體會,談一下理解。

分散式機器學習涉及cs兩個領域的結合:分散式系統和人工智慧。機器學習是解決人工智慧的手段,而分散式系統主要研究計算、存儲及其他應用層面上的分散式技術。根據CAP理論,加上不同應用側重不同,我們常需在設計分散式系統時限制使用場景,並做trade-off。

展開之前,先補充談一下hpc和並行計算。它們都屬系統方向,具體和分散式計算的差異不那麼明顯。分散式計算更注重在商用計算機上可擴展性帶來的質變。這在互聯網公司很流行:以前不能跑那麼大規模現在可以了,這是重點。企業有時並不那麼在意一個訓練任務是跑11個小時還是10個小時,因為優化這1小時時間需要投入大量人力和時間成本。一個可擴展的演算法,靠更多的核便能達到更快或可接受的時間。而hpc則更關注因計算時間帶來的質變,比如之前我們要跑好幾年的任務現在一個月就能跑完。hpc更流行於專用的大型計算場景(如氣候預測、燃燒模擬),這些應用往往是用特定數值方法求解偏微分方程模型。和機器學習不同的是,這些應用的大計算量不是由數據規模導致而是由演算法本身的複雜性決定(你很少見到sgd這樣方法會用在這些優化問題中)。因此,相應的hpc應用通常要跑在定製的高性能計算機上。要指出的是,hpc研究者有時會過於在乎加速比而忽略可擴展性。我們都知道中國能造出世界最快的超級計算機,卻沒有好的應用能跑上那麼多資源。

分散式機器學習中的分散式不僅包含計算,還涉及存儲。首先,計算的分散式就是要把問題切開,分布地去解決。對於機器學習的問題,切問題包括對訓練數據和訓練模型的切分。切分數據意味著減少計算量,而切分模型的方式決定了計算和通信的拓撲。理想情況下,機器學習問題的模型可以不做切分,但這並不滿足分散式計算可擴展的要求。一方面隨著數據量的增大,模型規模可能增大到超出單機內存,另一方面模型本身也變地越加複雜。那麼如何對數據和模型進行合理的剖分呢?一個原則是盡量同時,即在切分數據的同時盡量保證切開的模型大小均衡以及通信較優。一種情況,對於與數據相關的這類模型(如矩陣分解,pagerank,svd等,換句話說就是model是key-value的樣子,key對應一個物體或人),我們可以通過對數據的切分來控制切分模型的方式。我之前寫過的一個分散式計算框架Paracel里提供了豐富的數據切分方式,幫助用戶靈活地解決這類機器學習問題。另一些情況是模型不直接和數據相關(如LR、神經網路等),這時只要分別對數據和模型做各自的切分即可。除了分散式計算,分散式存儲也在分散式機器學習系統里發揮著作用。如參數伺服器的模型通信方式本質上是key-value的分散式內存。另外,早在mapreduce系統中,g就開始依賴分散式文件系統來完成容錯。

分散式機器學習演算法的可擴展性決定了它能解決問題的規模。一方面,可擴展性要求在時間上隨著資源的增加而減少。這裡所說的時間分為計算時間和通信時間,對應前段提到的數據切分和模型切分。事實上,我們常遇到的情況是切地越細通信越大。雖然因問題而異地優化對模型的剖分可以巧妙減少一些通信量,但總是有下限,因此」時間-核「曲線往往下降到一個臨界值後上升,這個轉折點就是該演算法的極限。例如對神經網路模型的切分粒度將在通信時間和計算時間相當時最優,此後,加入更多的資源,性能反而下降。另一方面,可擴展性體現在隨著問題規模越大,演算法能通過加入相應量的資源達到相同性能。這個目標的瓶頸往往在內存,因此分散式機器學習中對模型的切分也很重要。當然,應在盡量合理的範圍內剖分模型,比如在實際問題中,ALS模型的一個維度通常足夠放入單機內存,這時就不應過早地將問題複雜化,而只需要切分另外一個大的維度。

機器學習演算法往往是迭代地解優化問題,由於last reducer問題的存在,BSP的計算方式會浪費太多時間在等待上。Mapreduce解決的方式是設置時間,一旦超時即認為worker死掉重新分配一個worker。事實上,而作為BSP的推廣,SSP是更好的方式(上面的回答里也提到了)。還有一種方式是多切幾份數據,讓算地快的節點多算這些預留數據。簡單來說就是做「負載不均衡」:讓算地快的節點多算,算地慢的節點少算。

對於用戶,每一種成熟的演算法都值得擁有一個專用系統是成立的。但同時我們不應忽視機器學習演算法間的共性,這些特點幫助我們進行更好的抽象和優化。目前階段分散式機器學習在工業界現狀是,做演算法的和做系統的還相對脫節。原因可能是同時了解這兩個領域的人較少,因此公司將部門和目標獨立分開來。但設想如果一個工程師不懂圖演算法,那他如何能寫出高效的圖計算框架呢?對於機器學習系統也是一樣道理。展望分散式機器學習,隨著deep learning的流行,人們對計算性能要求變地更為苛刻,傳統HPC和優化人員將會更多地進入機器學習領域,這也將促進系統和演算法的同學進行更深入合作。

希望對大家有幫助。


看大家答的都很具象了,我來補充點大面上的事情。

一、前言

CS是圍繞計算開展的科學。而計算有三大要素:

  • 數據
  • 邏輯
  • 計算力

無論在哪個時代,我們都在圍繞著這三個事情開展對計算科學的研究。這三個要素構成了一個經典的木桶效應的場景。也就是說,三件事之間最弱的一環總會變成制約計算機科學發展的一個主要因素。因此,計算機科學總是在圍繞他們開展一個知二求三的過程。


二、大規模機器學習的誕生

1 簡單回顧一下歷史:

  • 計算機早期,我們有數據,有方法。但是缺乏計算力。

比如我們有密碼、有解密方法,但是總是籌不到足夠的人力來進行解密計算。
於是我們就有了電子計算機。

  • 信息化早期,我們有計算力、有方法。但是缺乏數據。

依託摩爾定律,在計算力問題基本解決了之後。數據的缺乏就變成了限制計算機科學開展研究的主要問題。
隨之而來的就是信息時代。

  • 目前,我們有計算力,有數據。但是缺乏方法

依託互聯網的告訴發展,在數據量問題基本解決了之後。邏輯方法的缺乏就變成了限制計算機科學開展研究的主要問題。
究其根本,是因為我們把計算科學應用到了超乎想像的領域中去。我們為其他學科帶來了研究的新思路。同時其他學科面臨的缺乏方法論的問題也會隨之引入到計算機科學中。


2 機器學習的處境
在不遠的一段時間之前,我們還在研究這個問題的浪前。我們並沒有什麼特別糙猛快的方法去解決邏輯思路的缺乏問題。
相比而言:

  • 計算能力,

我們只要不停的提高晶體管的密度,增加主頻,或者採用分散式或者集群的方法,總是能夠獲得期望的計算能力的;

  • 數據量

如今,互聯網為我們提供了前所未有的方法,去研究一些以前我們可望不可及的社會學問題。甚至是對他們進行定量的研究。當大家嘗到了甜頭之後,數理方法被廣泛地應用在了各行各業中去。面對如此廣泛地應用,我們暫時還遇不到缺乏數據的問題。他們就在我們的面前,直接用就可以了。

隨著應用場景愈發的深入,我們開始研究一些先前不可解覺得問題。比如N-S方程、非數論方法的密碼學特別地腦科學和認知科學。

我們很快就發現了一個嚴重的問題——傳統的數理方法和馮諾依曼麵條機體系並不能很好的應用在這些領域上。前兩者的問題還顯得並不是那麼的明顯,畢竟限制條件並不僅僅局限於方法論的缺失,還可以通過提高計算能力來解決。當我們有糙猛快的解決方案的時候,科技的進步總是會隨著人類的懶惰而放慢。
但是面對腦科學和認知科學。途有計算能力就捉襟見肘了。
我們很長的一段時間內,都沒有在數理方法上取得一個很好的進展來解決這兩個學科裡面的經典問題——大腦是怎麼工作的。我們甚至連其中的一點點小的功能都很難去復現出來。更不用說,獲得一個方法論來解釋這一整套問題。
究其原因,是因為我們的數理方法裡面,沒有一個像傅立葉變換或這樣合適的論域轉換方法,把語音識別、人臉識別、圖像識別等等問題很好的解決掉。儘管我們知道一旦有了數理方法之後整個問題的研究都會變得非常地機械、簡單、自然而且順手。
機器學習,就是在這樣的一個背景下應運而生的。


3機器學習里一些典型的坑
首先,機器學習需要做的事情一定要明確。因為我們的目標是去尋找一個有效的解決問題的途徑。
因此,機器學習這門學科開展的時候總是會圍繞著這樣的一些問題來開展:

  • 學習的本質、及其實現

目前來看,由於我們對量子計算這些個玄學問題還沒有很統一的理論。所以一切可以使用的計算方法都是基於馮諾依曼機的,而它的實現又是基於邏輯門的。邏輯門本質上是非線性過程,用處是分類。所以就算是出現的方法再千奇百怪,我們最後還是會受到邏輯門自身的影響。換句話說,所有的現存的學習方法及其實現,本質上都是分類器。我們需要做的是設計出不同的、可收斂的非線性分類方法以適應不同的學習場合。包括演算法本身的複雜度問題。

  • 問題的定義和描述

前面提到的不同的學習場合,就是現在機器學習領域裡面還沒有很清晰結論的領域。換人話說就是,我們目前有很多的機器學習方法,但是用哪種方法最有效。我們只能試一試。因此如何界定一個問題的複雜度及其適用的演算法還是一個迫切需要解決的問題。

  • 方法的有效性保障

這個有點像是傳統計算機領域的測試工程師的任務。也就是說,我們怎麼才能保證學習方法是儘可能的有效的。畢竟,機器學習方法並不能保證它所輸出的結論每次都是正確的。從蒙特卡落的角度來講,我們也需要儘可能的提高學習結果的準確性。
目前來看,我們的確缺乏一些比較高級的數理方法來解決這個問題,從而機器學習的效果到底好與壞變成了一個NP-hard問題。這極大的制約了機器學習的方法。

4一些淺見
前面說道,機器學習本質上是一種分類方法。更進一步的定義的話,機器學習是基於數據點對論域內進行有效分類的搜索演算法。
而搜索演算法可以樸素的分為深度優先和廣度優先。放到機器學習裡面來說就是DL和SVM這兩個經典演算法之間的差異。
這個也是一個可以挖掘的深坑。我們可以參考搜索演算法的一些走過的路應用的ML裡面來。主要來說,還是工作量的問題。

以上


我只想說feature提不好的情況下。。。啥演算法都白瞎。。。


30年前理論上的東西,運算能力終於跟上了。

沒覺得有什麼純原創的新鮮玩意。連分散式的根基mapreduce都是從functional programming裡面來的。

深度學習更不用說了,你告訴我它和神經網路有什麼區別…

現在好的研究所都是六分研究人員,四分工程人員,主要還是平台的搭建。

//------
補充一下,我可能語氣是不太好,道歉,今人的研究必然有價值,也必然相對古人有進步。但依然,創新性不大這點還是沒變。

事實上現在做研究主要是玩domain knowledge,真到演算法層面來回來去就那點玩意。

這個時代本來就是搭建平台的時代。新工具,把以前想干不能幹的事幹了。

能對工業界造成震動的技術,在學術界絕對都不是新東西。與其說是大數據的時代,不如說是分散式系統的時代。


//-------
我的第一篇paper就是純演算法上,不sample,把數據切成數據流來解決原演算法無法在大數據上跑的問題,因為內存一口氣裝不下。(當時沒聽過graphLab這種直接用硬碟的Bug工具,不然也不會搞這個了)

我老師明確跟我說,這東西你去工業界沒人屌你的,都是直接分散式硬來,完全用人(機器)多力量大來硬解。我老師一個工業界的朋友有一次一起吃飯,聊起那片文章時跟我說,這篇文章找工作時千萬別和人家說具體是什麼,就說大數據就行了。

現在研究的方向真涉及大數據的都是怎麼更好更高效的用更大的cluster。演算法上scalability已經很不熱了。

//----
太多人把沒有原創性和沒有價值認為是一個意思了… 您要是這麼覺得就沒有討論的必要了。

別說什麼今人古人了。任何一篇paper,都有它自己與之前不同的東西,也有他自己獨特的考量。拿這個說有什麼意義呢?

現在好多組所做的事都是,看看還有哪個領域deep learning沒被人用過,趕緊上。完全是應用層面的東西了。


我是來搞笑的。
幾個回答很好啊。總結下:
1殺雞不要用牛刀
2殺雞用牛刀雞也不會更好吃
3殺雞不要用牛刀,多幾個人用多把雞刀更快。
4人多殺雞,雞刀都不用磨。


推薦閱讀:

如何成為一個年薪 50 萬以上的數據分析師?
微軟大數據專家對於第 86 屆奧斯卡金像獎進行預測並有高準確率,從技術角度看是如何做的?
如何系統地學習數據挖掘?
用機器學習的方法來處理大數據,是直接學 Spark,還是重點學習 Hadoop,了解 Spark?
機器學習,數據挖掘在研究生階段大概要學些什麼?

TAG:數據挖掘 | 機器學習 |