- 原文地址:What would be your advice to a software engineer who wants to learn machine learning?
- 原文做者:Alex Smola
- 譯文出自:掘金翻譯計劃
- 本文永久連接:github.com/xitu/gold-m…
- 譯者:lsvih
- 校對者:吃土小2叉,Tina92
這很大一部分都取決於這名軟件工程師的背景,以及他但願掌握機器學習的哪一部分。爲了具體討論,如今假設這是一名初級工程師,他讀了 4 年本科,從業 2 年,如今想從事計算廣告學(CA)、天然語言處理(NLP)、圖像分析、社交網絡分析、搜索、推薦排名相關領域。如今,讓咱們從機器學習的必要課程開始討論(聲明:下面的清單很不完整,若是您的論文沒有被包括在內,提早向您抱歉)。html
線性代數
不少的機器學習算法、統計學原理、模型優化都依賴線性代數。這也解釋了爲什麼在深度學習領域 GPU 要優於 CPU。在線性代數方面,你至少得熟練掌握如下內容:前端
優化與基礎運算react
大多數時候提出問題是很簡單的,而解答問題則是很困難的。例如,你想對一組數據使用線性迴歸(即線性擬合),那麼你應該但願數據點與擬合線的距離平方和最小;又或者,你想作一個良好的點擊預測模型,那麼你應該但願最大程度地提升用戶點擊廣告機率估計的準確性。也就是說,在通常狀況下,咱們會獲得一個客觀問題、一些參數、一堆數據,咱們要作的就是找到經過它們解決問題的方法。找到這種方法是很重要的,由於咱們通常得不到閉式解。android
凸優化ios
在大多狀況下,優化問題不會存在太多的局部最優解,所以這類問題會比較好解決。這種「局部最優即全局最優」的問題就是凸優化問題。git
(若是你在集合的任意兩點間畫一條直線,整條線始終在集合範圍內,則這個集合是一個凸集合;若是你在一條函數曲線的任意兩點間畫一條直線,這兩點間的函數曲線始終在這條直線之下,則這個函數是一個凸函數)github
Steven Boyd 與 Lieven Vandenberghe 合著的書能夠說是這個領域的規範書籍了,這本書很是棒,並且是免費的,值得一讀;此外,你能夠在 Boyd 的課程中找到不少很棒的幻燈片;Dimitri Bertsekas 寫了一系列關於優化、控制方面的書籍。讀通這些書足以讓任何一我的在這個領域立足。web
隨機梯度降低(SGD)面試
大多數問題其實最開始都是凸優化問題的特殊狀況(至少早期定理如此),可是隨着數據的增長,凸優化問題的佔比會逐漸減小。所以,假設你如今獲得了一些數據,你的算法將會須要在每個更新步驟前將全部的數據都檢查一遍。算法
如今,我不懷好意地給了你 10 份相同的數據,你將不得不重複 10 次沒有任何幫助的工做。不過在現實中並不會這麼糟糕,你能夠設置很小的更新迭代步長,每次更新前都將全部的數據檢查一遍,這種方法將會幫你解決這類問題。小步長計算在機器學習中已經有了很大的轉型,配合上一些相關的算法會使得解決問題更加地簡單。
不過,這樣的作法對並行化計算提出了挑戰。咱們於 2009 年發表的《Slow Learners are Fast》論文可能就是這個方向的先導者之一。2013 年牛峯等人發表的《Hogwild》論文給出了一種至關優雅的無鎖版本變體。簡而言之,這類各類各樣的算法都是經過在單機計算局部梯度,並異步更新共有的參數集實現並行快速迭代運算。
隨機梯度降低的另外一個難題就是如何控制過擬合(例如能夠經過正則化加以控制)。另外還有一種解決凸優化的懲罰方式叫近端梯度算法(PGD)。最流行的當屬 Amir Beck 和 Marc Teboulle 提出的 FISTA 算法_files/Breck_2009.pdf)了。相關代碼能夠參考 Francis Bach 的 SPAM toolbox。
非凸優化方法
許多的機器學習問題是非凸的。尤爲是與深度學習相關的問題幾乎都是非凸的,聚類、主題模型(topic model)、潛變量方法(latent variable method)等各類有趣的機器學習方法也是如此。一些最新的加速技術將對此有所幫助。例如個人學生 Sashank Reddy 最近展現瞭如何在這種狀況下獲得良好的收斂速率。
也能夠用一種叫作譜學習算法(Spectral Method)的技術。Anima Anandkumar 在最近的 Quora session 中詳細地描述了這項技術的細節。請仔細閱讀她的文章,由於裏面乾貨滿滿。簡而言之,凸優化問題並非惟一可以可靠解決的問題。在某些狀況中你能夠試着找出其問題的數學等價形式,經過這樣找到可以真正反映數據中聚類、主題、相關維度、神經元等一切信息的參數。若是你願意且可以將一切託付給數學解決,那是一件無比偉大的事。
最近,在深度神經網絡訓練方面涌現出了各類各樣的新技巧。我將會在下面介紹它們,可是在一些狀況中,咱們的目標不只僅是優化模型,而是找到一種特定的解決方案(就好像旅途的重點實際上是過程同樣)。
(分佈式)系統
機器學習之因此如今成爲了人類、測量學、傳感器及數據相關領域幾乎是最經常使用的工具,和過去 10 年規模化算法的發展密不可分。Jeff Dean 過去的一年發了 6 篇機器學習教程並非巧合。在此簡單介紹一下他:點擊查看,他是 MapReduce、GFS 及 BigTable 等技術背後的創造者,正是這些技術讓 Google 成爲了偉大的公司。
言歸正傳,(分佈式)系統研究爲咱們提供了分佈式、異步、容錯、規模化、簡單(Simplicity)的寶貴工具。最後一條「簡單」是機器學習研究者們經常忽視的一件事。簡單(Simplicity)不是 bug,而是一種特徵。下面這些技術會讓你受益良多:
分佈式哈希表
它是 memcached、dynamo、pastry 以及 ceph 等的技術基礎。它們所解決的都是同一件事情 —— 如何將對象分發到多臺機器上,從而避免向中央存儲區提出請求。爲了達到這個目的,你必須將數據位置進行隨機但肯定的編碼(即哈希)。另外,你須要考慮到當有機器出現故障時的處理方式。
咱們本身的參數服務器就是使用這種數據佈局。這個項目的幕後大腦是個人學生 Mu Li 。請參閱 DMLC 查看相關的工具集。
一致性與通訊
這一切的基礎都是 Leslie Lamport 的 PAXOS 協議。它解決了不一樣機器(甚至部分機器不可用)的一致性問題。若是你曾經使用過版本控制工具,你應該能夠直觀地明白它是如何運行的——好比你有不少機器(或者不少開發者)都在進行數據更新(或更新代碼),在它們(他們)不隨時進行交流的狀況下,你會如何將它們(他們)結合起來(不靠反覆地求 diff)?
在(分佈式)系統中,解決方案是一個叫作向量時鐘的東西(請參考 Google 的 Chubby)。咱們也在參數服務器上使用了這種向量時鐘的變體,這個變體與本體的區別就是咱們僅使用向量時鐘來限制參數的範圍(Mu Li 作的),這樣能夠確保內存不會被無限增加的向量時鐘時間戳給撐爆,正如文件系統不須要給每一個字節都打上時間戳。
容錯機制、規模化與雲
學習這些內容最簡單的方法就是在雲服務器上運行各類算法,至於雲服務能夠找 Amazon AWS、Google GWC、Microsoft Azure 或者 其它各類各樣的服務商。一次性啓動 1,000 臺服務器,意識到本身坐擁如此之大的合法「僵屍網絡」是多麼的讓人興奮!以前我在 Google 工做,曾在歐洲某處接手 5,000 餘臺高端主機做爲主題模型計算終端,它們是咱們經過能源法案獲益的核電廠至關可觀的一部分資源。個人經理把我帶到一旁,偷偷告訴我這個實驗是多麼的昂貴……
可能入門這塊最簡單的方法就是去了解 docker 了吧。如今 docker 團隊已經開發了大量的規模化工具。特別是他們最近加上的 Docker Machine 和 Docker Cloud,可讓你就像使用打印機驅動同樣鏈接雲服務。
硬件
說道硬件可能會讓人迷惑,可是若是你瞭解你的算法會在什麼硬件上運行,對優化算法是頗有幫助的。這可讓你知道你的算法是否能在任何條件下保持巔峯性能。我認爲每一個入門者都應該看看 Jeff Dean 的 《每一個工程師都須要記住的數值》。我在面試時最喜歡的問題(至少如今最喜歡)就是「請問你的筆記本電腦有多快」。瞭解是什麼限制了算法的性能是頗有用的:是緩存?是內存帶寬?延遲?仍是磁盤?或者別的什麼?Anandtech 在微處理器架構與相關方面寫了不少很好的文章與評論,在 Intel、ARM、AMD 發佈新硬件的時候不妨去看一看他的評論。
統計學
我故意把這塊內容放在文章的末尾,由於幾乎全部人都認爲它是(它的確是)機器學習的關鍵於是忽視了其它內容。統計學能夠幫你問出好的問題,也能幫你理解你的建模與實際數據有多接近。
大多數圖模型、核方法、深度學習等都能從「問一個好的問題」獲得改進,或者說可以定義一個合理的可優化的目標函數。
統計學相關資料
Larry Wasserman 的書《All of Statistics》很好地介紹了統計學。或者你也能夠看看 David McKay 的 《Machine Learning》一書,它是免費的,內容豐富而全面。此外還有不少好書值得一看,例如 Kevin Murphy 的、Chris Bishop 的、以及 Trevor Hastie、Rob Tibshirani 與 Jerome Friedman 合著的書。還有,Bernhard Scholkopf 和我也寫了一本。
隨機算法與機率計算
統計學算法本質上也是個計算機科學方面的問題。可是統計學的算法與計算機科學的最大區別在於,統計學是將計算機做爲一個工具來設計算法,而不是做爲一個黑箱進行調參。我很喜歡這本 Michael Mitzenmacher 與 Eli Upfal 合著的書,它涵蓋了不少方面的問題,而且很容易讀懂。另外若是你想更深刻地瞭解這個「工具」,請閱讀這本 Rajeev Motwani 和 Prabhakar Raghavan 合著的書籍。這本書寫的很棒,可是沒有統計學背景很難理解它。
這篇文章已經寫的夠久了,不知道有沒有人能讀到這裏,我要去休息啦。如今網上有不少很棒的視頻內容能夠幫助你學習,許多教師如今都開通了他們的 Youtube 頻道,上傳他們的上課內容。這些課程有時能夠幫你解決一些複雜的問題。這兒是個人 Youtube 頻道歡迎訂閱。順便推薦 Nando de Freitas 的 Youtube 頻道,他比我講得好多了。
最後推薦一個很是好用的工具:DMLC。它很適合入門,包含了大量的分佈式、規模化的機器學習算法,還包括了經過 MXNET 實現的神經網絡。
雖然本文還有不少方面沒有提到(例如編程語言、數據來源等),可是這篇文章已經太長了,這些內容請參考其餘文章吧~
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 Android、iOS、React、前端、後端、產品、設計 等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃。