天天看點

【珍藏】CMU大師對軟體工程師的系統建議(附書和論文下載下傳)

問題:你對想要學習機器學習的軟體工程師有哪些建議?(what would be your advice to a software engineer who wants to learn machine learning?)

alex smola: 這很大程度上取決于軟體工程師的背景及其具體想掌握機器學習的哪部分知識。簡而言之,我們以一名擁有四年大學學位和一到兩年行業經驗的初級程式員為例,并假設這位程式員希望學習計算廣告學、自然語言處理、圖像分析、社交網絡以及搜尋和排序。那麼,我們先說掌握機器學習有哪些基本要求(緻學術界同仁的免責聲明:下列内容并不完整,如果未列入你的論著,在此提前緻歉)。

線性代數

機器學習以及資料統計和優化都需要這方面知識。這也是為什麼gpu(圖形處理器)遠比cpu(中央處理器)适合進行機器學習。作為程式員,至少需要基本掌握以下内容:

标量、向量、矩陣、張量

把它們看作你可以組建并互相轉換的零維、一維、二維、三維和更高維物體,有點像樂高玩具,它們使得基本的資料轉換成為可能。

特征向量、範數、矩陣近似、分解

這些概念本質上是讓你習慣線性代數的用法。如果你希望分析一個矩陣的情況(比如,檢查為何循環神經網絡中出現梯度消失,為何增強學習算法中控制器出現分歧(diverge)),你就必須要了解在應用矩陣和向量時可能出現的增長和減小範圍是多少。如果你希望代碼表現出色和穩定,那麼低秩等矩陣近似算法或喬列斯基分解就很有用。

數值線性代數

如果你需要做很多最優化計算,那麼這部分知識就很有用。對核方法和深度學習來說如此,對圖像模型和采樣器而言則不那麼重要。

書籍

<a target="_blank">serge lang, linearalgebra</a>

線性代數的基本介紹,适合大學生。

<a target="_blank">bela bolobas,linear analysis</a>

比上面這本難很多,但對想做很多數學和泛函分析的人來說更有用。如果你想攻讀博士,這本書或許不錯。

<a target="_blank">lloyd trefethen anddavid bau, numerical linear algebra</a>

最優化(和基本演算)

在許多情況下,設定要問的問題是相當容易的,但得出答案卻沒沒那麼簡單。舉例來說,如果要對一些資料進行線性回歸(即找到一條線),你可能希望盡量減少與觀測值的距離平方的總和。同樣,如果想獲得一個好的點選率預測模型,你就得最大化對于人們點選廣告機率預測的準确性。這意味着我們通常會有一些目标、一些參數和大量資料,而我們需要通過一種方式來解決問題。這一點很重要,尤其因為我們常常不會有一個閉合式解決方案。

凸優化

很多時候,在優化問題不存在許多局部解決方案的情況下是不錯的。當問題為凸時就會發生這種情況。(若你能在一個集合内任意兩點間畫出一條直線且這條直線處于該集合内,則這一集合就是凸的。若你能在圖上任意兩點間畫出一條直線且這條直線位于圖形上方,則這一函數是凸的。)

也許這一領域的經典書籍是這本由steven boyd和lieven vandenberghe所撰寫的 convex optimization 。本書免費且非常棒。(回複041501下載下傳,共730頁)此外,boyd的課程裡也有許多很不錯的幻燈片集。dimitri bertsekas也已經編寫了關于最優化、控制等的寶典。這些應該足以供任何人開始了解這個領域了。

随機梯度下降算法

這一算法早期在很大程度上隻是凸優化的一種特殊情況(至少早期定理是這樣的),但最近發展很大,并且絕非是由于資料的增多。原因是,想象一下你有一些資料要處理,而你的算法需要将所有的資料都浏覽一遍後才能繼續新的步驟。而如果我故意給你10份同樣的資料,那麼你就必須重複10次工作,卻沒有什麼實質性用處。顯然,現實情況不會如此糟糕,但如果你需要操作多次小的新步驟,而每個小步驟之後都需要觀測,它就能幫上忙。這在機器學習領域帶來了相當大的變革型影響。此外,許多關聯算法都容易得多。

我們面臨的挑戰是如何将其并行化。也許這個方向的第一步之一就是我們2009年的 slow learners are fast 論文(回複041502下載下傳)。最新版本是無鎖變異型,例如niu等于2013年所著的hogwild論文(回複041503下載下傳)。簡而言之,這些算法通過人工計算機計算局部梯度并以異步方式更新共識參數集來運作。

另一個挑戰是如何應對控制過度拟合的各種方法,例如通過正則化來實作。對于凸罰函數來說,有一種所謂近端梯度算法。一種比較流行的選擇是amir beck和marc teboulle的fista算法。部分代碼參見francis bach的spam toolbox(http://spams-devel.gforge.inria.fr/)。

非凸方法

許多機器學習問題都是非凸問題。從本質上來說,任何與深度學習相關的問題都是。但聚類、主題模型和幾乎任何潛變量方法和目前幾乎所有在機器學習領域有意思的問題也都是。部分加速技術可以提供幫助。例如,我的學生 sashank reddy最近展示了在這種情況下如何獲得收斂的良好比率。

有許多被稱為譜方法的技術可以使用。 anima anandkumar在她最近的quora session中已經非常詳盡地回答了這一問題。請參閱她的回複,因為其回複無比詳細(https://www.quora.com/profile/anima-anandkumar-1)。概括地說,凸問題并非唯一能夠确切解決的問題。在某些情況下,可以得出一個難題的數學表達式以顯示隻有某一組特定的參數能找到所有的叢集、主題、相關比例、神經元或所有資料中的任何東西。這僅在你有能力且願意花很多數學的功夫時才有效。

在教育訓練深層網絡方面(deep networks),最近有許多新技巧。我會在後面的内容中提及這些,但在某些情況下,目标不僅僅是優化,而是制定出一套具體的解決方案(幾乎像是那本題為the journey is the goal《旅程即是目的》的書)。

系統

機器學習正在成為大部分有關于人、測量、傳感器和資料的關鍵要素,這與過去十年标度算法(scaling algorithms)的突破密不可分。jeff dean去年出了六套機器學習教程,也并非偶然。如果有人過了十年與世隔絕的生活,在這裡給補充一下,他就是mapreduce、谷歌檔案系統、bigtable和其他十多項成就了谷歌的關鍵技術背後的男人。

說笑歸說笑,關于系統的研究為解決分布、異步、容錯、可擴充和簡易問題提供了寶貴的工具。後者是機器學習研究人員常常忽視的一點。簡易是一種特性,不是一個錯誤。一些基本的技巧将帶給你很多:

分布式哈希表

這實質上是如分布式緩存(memcached)、dynamo、 pastry和orceph等方法

建構的基礎。它們都解決同一個問題——如何在避免通路之前資料輸往的中央儲存庫的情況下向多台機器釋出資料。為了達到這一目的,你需要将位址以一種随機又确定的方式編碼(也就是哈希)。此外,你需要解決如果任何一台機器出現故障時誰将負責處理。

這就是我們在參數伺服器(parameter server)中使用的資料布局。我的學生李沐是這個項目背後的智囊。工具組合參見dmlc(http://dmlc.ml/)。

一緻性和資訊傳送

所有這一切的教父是leslie lamport的paxos 協定。它解決了在不是所有機器任何時候都可用或有些機器出現故障時如何達成共識的問題(是的,我在這兒就一句帶過了)。如果你曾經使用過版本控制,你可能靠直覺知道它是如何工作的——大量機器(或開發者)産生更新(或代碼段),而你希望将這些都結合成有意義的資訊(例如,你不該兩次運用微分),但又不需要所有機器與其他所有機器一直傳遞着資訊。

在系統中,解決方案是使用向量時鐘(參見例子:谷歌的chubby)。我們在參數伺服器中使用它的一種變體。關鍵的差別在于(均引自李沐)在參數範圍内使用向量時鐘。這可以確定不會因為時間辨別耗盡記憶體,就像一個檔案系統并不需要為每一個位元組都記錄一個時間辨別。

容錯、scaling和雲

最簡單的自學方法就是在亞馬遜aws、谷歌gwc、微軟azure, 或你可以找到的各個其他平台上運作算法。當你第一次啟動1000個伺服器,意識到你正在向一個實際上的合法僵屍網絡發送大量指令時,還是很令人激動的。我在谷歌工作時,我們控制了歐洲某處了5000個高端機器,用于主題模型中的推理。我們所調用的能源價值如果和一個核電站相比,也要占很大的比重了。我的經理當時把我叫到一旁,說這真是個昂貴的實驗……

或許最容易起步的是學習docker。為了讓scaling更容易,人們熱火朝天地開發了不少工具。docker machine和docker cloud或許是近來最好的新工具,使你能像更換列印機驅動一樣友善地連接配接不同的雲端。

硬體

這似乎顯而易見,但如果你了解自己算法所運作的硬體,的确會很有幫助。這會讓你知道你寫的代碼是否已經接近峰值性能。初學者可以閱讀jeff dean的numbers every engineer should know一書。我在面試時最喜歡問的問題(曾經)是,應聘者的電腦有多快。知道算法的局限大有裨益:是緩存、記憶體帶寬、延遲時間還是硬碟等等。anandtech上有非常棒的介紹性文章,以及對微處理器架構等相關内容的測評。隻要英特爾、arm、amd釋出新硬體時,都可以去看一看。

統計學

我特意把這點留到最後。因為每個人都知道這是關鍵(的确如此),然後就忽略了其他所有東西。統計學確定你能問出好問題,同時幫助你了解自己在資料模組化時用了多少估算。

從圖像模型、核方法到深度學習等等,很多改進其實來自提出對的問題,也即定義了合理的優化目标,進而進行最優化。

statistics proper

larry wasserman的《統計學完全教程》(all of statistics)是不錯的入門教材。另外也可以看一下 david mckay 的 machine learning 一書。該書免費(篇幅很長、内容全面,回複041504下載下傳)。其他還有不少好書,比如說 kevin murphy, chris bishop, trevor hastie, robtibshirani 以及 jerome friedman 的著作the elements of statistical learning:data mining, inference, and prediction。是的,bernhard scholkopf 和我也寫了一本learning with kernels。

随機算法和機率統計

本質上就是用計算機科學解決一樣的問題,關鍵差別在于他們是設計算法的一種工具,而非用來适配參數的一個問題。我特别喜歡 michael mitzenmacher 和eli upfal 寫的書probability and computing: randomized algorithms and probabilistic analysis ,非常易讀但同時談到了許多深刻的問題。如果你想更深入地了解這些工具,還有 rajeev motwani 和 prabhakar raghavan 的書randomized algorithms,寫得很好,不過如果你沒有較好的統計學背景,可能較難讀懂。

我的回答可能已經夠長了,很少有人會一直讀到這裡。是以我接下來說得比較簡短。網上有許多非常棒的視訊資料。許多教授現在有自己youtube頻道,并上傳自己的課程視訊。如果你在學習比較複雜的工具,這些視訊會有所幫助。我的視訊在這裡(https://www.youtube.com/user/smolix/playlists),nando de freitas的要好很多。

其他還有一些工具。dmlc是好的起點,其中有許多用于分布式可擴充推理的算法,包括基于mxnet的神經網絡。

還有很多沒談到的:程式設計語言、資料源等等。但這個回答已經太長了,我會在其他問題中繼續讨論。

附錄,alex smola 著書:

g. bakir, t. hofmann, b. schölkopf, a.j. smola, b. taskar, and s.v.n. vishwanathan, editors. predicting structured data. mit press, cambridge, ma, 2006.

s. mendelson and a. j. smola, editors. machine learning, proceedings of the summer school 2002, australian national university, volume 2600 of lecture notes in computer science. springer, 2003.

b. schölkopf and a. j. smola. learning with kernels. mit press, 2002.

b. schölkopf, c. j. c. burges, and a. j. smola, editors. advances in kernel methods--support vector learning. mit press, cambridge, ma, 1999.

a. j. smola, p. l. bartlett, b. schölkopf, and d. schuurmans, editors. advances in large margin classifiers. mit press, cambridge, ma, 2000.

繼續閱讀