1. 程式人生 > >做機器學習相關工作,需要哪些技能 ?(附資源連結)

做機器學習相關工作,需要哪些技能 ?(附資源連結)

640?wx_fmt=png

來源:Python開發者(PythonCoder)

原文連結:http://blog.jobbole.com/113592/

本文共2650字,建議閱讀5分鐘
本文摘編了兩位網友的回答解讀機器學習有關工作所備的技能有哪些!

一、Jonathan A. Cox(機器學習和應用物理研究人員)的回答:

這裡有很多回復都提到了一些創業公司常用的工具。值得注意的是,在你 35 歲以上的職業生涯中,這些工具會變得完全不同。所以最好的辦法是熟悉基本概念和數學。

其次,機器學習領域太過繁雜,根本不可能真正深入理解幾十種不同的演算法。我覺得你可以先深究幾個最有前景的演算法。說是這麼說,你也要很瞭解一些基礎的東西才行,比如說樸素貝葉斯、支援向量機、感知器、決策樹。

最後,很多創業公司,或者非研究領域的人會告訴你要專注於那些快要老掉牙的演算法(比如支援向量機 (SVM))和大資料的資料庫工具(比如說Hadoop)。考慮到你剛剛起步,我覺得你可以專注於那些很快會發展起來的架構:神經網路,單指令流多資料流(SIMD)向量計算(比如說GPU)。神經網路最近 10 年內開始革命性地顛覆自然語言處理、機器視覺、語音識別和其他領域。鑑於它的強大,這個影響還會繼續下去。

綜上,我會選擇諸如 GPU 加速這類演算法來自學和實現,再加一些分散式資料庫的知識。以下是值得考慮的演算法:

  • 深度置信網或者層疊降噪自動編碼機 / Deep Belief Nets or Stacked DenoisingAutoencoders

  • 卷積神經網路(CNN

  • 長短記憶(LSTM)時間遞迴神經網路

  • 結構遞迴神經網路(通常用於自然語言處理)

  • word2vec 神經網路以及相關通過上下文學習詞語的相關演算法

另外一個很有前景的領域是強化學習,尤其是 Deep Mind Q-learning。當你用到延遲獎勵功能(比如玩 Atari 遊戲時的得分),並且不能在你的網路中直接計算引數梯度時,你會用到強度學習。當你熟悉了上述的演算法之後,你大約會想探索一下這個領域。這個領域跟機器人以及,更現實一點,關於人和動物是怎麼學習的模擬,很有關聯。

補充:我現在有這樣的想法:過去的一年中,結合不同的神經演算法,得到一個深度系統的方法逐漸顯露出重大進步;因為這個方法的整體大於它的組成部分。鑑於奠基石已經鋪下,我預計最顯著的進步很可能會落在這個方向。一定程度上,細緻整頓整個系統之前訓練好個體模組,以及更快的計算群讓這種進步成為了可能。(然而我們仍會在單個的演算法中看到進展。)

換句話說,現在結合了卷積神經網路和多層感知器(MLP)的 LSTM,可以做到用句子描述影象之類的事情(來源:Goolge/Stanford)。類似地,已經有了具備強化學習能力的卷積神經網路和 MLP 組成的 Atari 遊戲競技網路。

往這個清單加上新東西同樣很容易:把通過 word2vec/GloVe/skip-gram 訓練出來的詞向量輸送給這樣的複合網路,或者甚至是用遞迴神經網路訓練的情感分析層。

有了神經網路和反向傳播,在任意幾何體上結合/疊加層,以及把組合作為整體系統來訓練都變得容易了,它們可以擴展出強大的能力。

由許多不同種類的神經網路組成,用各種技術連線在一起,單獨訓練,協同微調,這些混合系統將繼續向我們展示充滿戲劇性的新能力。

二、Joseph Misiti 的回答分享,4400+ 頂

個人認為,以下是部分必需技能:

更新:我在 Github 建立了一個 repo,裡面有上百的資源連結能夠幫你起步。

https://github.com/josephmisiti/awesome-machine-learning

Python/C++/R/Java

假如你想在機器學習領域裡找一份工作,你大概遲早要學會這些語言。Python Numpy Scipy [2] 非常有用,因為這些庫不僅有跟 MATLAB 相似的功能,而且將其整合進WebService,或者在 Hadoop(見下)裡使用的時候也十分簡單。在加快程式碼執行速度的時候會用到C++R [3] 在統計和畫圖的時候非常好用。Hadoop [4] 是用 Java寫的,所以當你實現 mappers reducers 的時候可能需要用到 Java(雖然你也可以通過 Hadoop streaming  [5] 使用指令碼語言)。

概率和統計

學習演算法裡的很大一部分都基於概率和統計理論,比如說樸素貝葉斯 [6]、高斯混合模型 [7]、隱 Markov 模型 [8]。想要理解這些模型,就需要紮實的概率和統計功底。測度論 [9] 怎麼拼命學都不過分。把統計作為模型的評價指標,比方說混淆矩陣、ROC 曲線、p值等等。

應用數學和演算法

對於 SVM [10] 這些判別模型,就需要演算法理論的紮實基礎了。即便你不需要從頭開始實現SVM,學習演算法理論也可以幫助你理解演算法。需要學習的東西有凸優化 [11],梯度下降 [12],二次規劃 [13],拉格朗日 [14],偏微分方程等等。要習慣看求和符號 [16]

分散式計算

如今大部分的機器學習工作都要求使用大型資料集(見《資料科學》)[17]。處理這些資料並不能憑藉一臺機器,而是需要把工作分派給整一個叢集。像 ApacheHadoop [4] 這樣的專案和亞馬遜的 EC2 [18] 這樣的雲服務就能以合理的成本方便地處理這些資料。雖然 Hadoop 把很多硬核的分散式計算問題隱去了,對 map-reduce [22] 和分散式檔案系統 [19] 等方面有透徹的理解還是十分必要的。Apache Mahout [20] Apache Whirr [21] 也很值得一看。

精通 Unix/Linux 工具

除非你運氣好,不然你總是需要修改你資料集的格式來載入到 RHadoopHBase 等。Python這些指令碼語言(使用 python 裡的 re)也能用來完成這個事情,但是最好的方法大約還是掌握專門為此設計的 unix 工具:cat [24]grep [25]find [26]awk [27]sed [28]sort [29]cut [30]tr [31]等。因為最有可能在基於 Linux 的機器上處理這些資料(我記得 Hadoop 並不能在 Windows 上運作),你一定可以用到這些工具。要學會熱愛並儘可能地使用這些工具。這些工具讓事情簡單多了,比如這個例子 [1]

熟悉Hadoop的子專案

HBaseZookeeper [32]Hive [33]Mahout 等。這些專案可以儲存或讀取資料,而且他們可擴充套件。

瞭解高階訊號處理的技術

特徵提取是機器學習最重要的部分之一。如果你的特性提取得不好,那不論你使用什麼演算法,效能都不會好。根據具體情況,你可能可以應用一些很酷炫的高階訊號處理演算法,比方說 wavelets[42]shearlets [43]curvelets[44]contourlets [45]bandlets [46]。瞭解並嘗試應用時間-頻率分析方法 [47]。如果你還沒有了解傅立葉分析和卷積的話,這些東西也值得學習。後面提到的這倆是訊號處理的基礎知識。

最後,儘量多練習、多閱讀。有空的時候可以讀讀像 GoogleMap-Reduce [34]Google File System [35]Google Big Table [36]The UnreasonableEffectiveness of Data [37] 上的論文。網上也有很多關於機器學習的好書的免費資源,這些也應該多讀。[38][39][40] 我找到了一個很好的課程,並且在轉發到Github [41]。與其直接使用開源的擴充套件包,不如自己寫一份並且對比結果。如果你能從頭寫一個支援向量機,你就會明白像支援向量、gammacosthyperplanes 等的概念。載入資料並開始訓練並不難,難的是理解這所有的概念。

前文提到的參考連結:

[1] http://radar.oreilly.com/2011/04…

[2] http://numpy.scipy.org/

[3] http://www.r-project.org/

[4] http://hadoop.apache.org/

[5] http://hadoop.apache.org/common/…

[6] http://en.wikipedia.org/wiki/Nai…

[7] http://en.wikipedia.org/wiki/Mix…

[8] http://en.wikipedia.org/wiki/Hid…

[9] http://en.wikipedia.org/wiki/Mea…

[10] http://en.wikipedia.org/wiki/Sup…

[11] http://en.wikipedia.org/wiki/Con…

[12] http://en.wikipedia.org/wiki/Gra…

[13] http://en.wikipedia.org/wiki/Qua…

[14] http://en.wikipedia.org/wiki/Lag…

[15] http://en.wikipedia.org/wiki/Par…

[16] http://en.wikipedia.org/wiki/Sum…

[17] http://radar.oreilly.com/2010/06…

[18] http://aws.amazon.com/ec2/

[19] http://en.wikipedia.org/wiki/Goo…

[20] http://mahout.apache.org/

[21] http://incubator.apache.org/whirr/

[22] http://en.wikipedia.org/wiki/Map…

[23] http://hbase.apache.org/

[24] http://en.wikipedia.org/wiki/Cat…

[25] http://en.wikipedia.org/wiki/Grep

[26] http://en.wikipedia.org/wiki/Find

[27] http://en.wikipedia.org/wiki/AWK

[28] http://en.wikipedia.org/wiki/Sed

[29] http://en.wikipedia.org/wiki/Sor…

[30] http://en.wikipedia.org/wiki/Cut…

[31] http://en.wikipedia.org/wiki/Tr_…

[32] http://zookeeper.apache.org/

[33] http://hive.apache.org/

[34] http://static.googleusercontent….

[35]http://static.googleusercontent….

[36]http://static.googleusercontent….

[37]http://static.googleusercontent….

[38] http://www.ics.uci.edu/~welling/…

[39] http://www.stanford.edu/~hastie/…

[40] http://infolab.stanford.edu/~ull…

[41] https://github.com/josephmisiti/…

[42] http://en.wikipedia.org/wiki/Wav…

[43] http://www.shearlet.uni-osnabrue…

[44] http://math.mit.edu/icg/papers/F…

[45] http://www.ifp.illinois.edu/~min…

[46] http://www.cmap.polytechnique.fr…

[47 ]http://en.wikipedia.org/wiki/Tim…

[48] http://en.wikipedia.org/wiki/Fou…

[49 ]http://en.wikipedia.org/wiki/Con…

640?wx_fmt=png

640?wx_fmt=jpeg