1.前言 — 程序員是一個知識更新較為迅速的一個職業,這個行業的知識的更新速度,有的時候會超過你的學習速度。大部分的人都在不斷的更新自己的知識體系,這里筆者要向讀者安利一下機器學習(包含深度學習)的重要性,以及常見的知識。作為個人能力的提升,筆者覺得這一點是程序猿/媛,需要掌握的一想技能。 其實在互聯網公司工作過的同學都應該有這樣的感觸,我們正在從IT到DT的轉型,算法在應用中變得越來越重要了。
處在向DT轉型中的我們也就理所當然的需要掌握DT的核心——算法。外界將大數據吵得如火如荼,但對于業內人來說,這些東西只是吵概念而已,簡單的大數據是沒有太大意義的,數據就好比是發動機運轉需要的燃料,而算法則是發動機。只有有了發動機數據才能發揮它的價值。就像石油已經在地下沉睡千萬年,在發動機產生前并沒有人認識到它的價值,但發動機產生后,石油才成為像黃金一樣珍貴的東西。所以我們必須掌握算法知識才能更好的駕馭DT這輛戰車。
然而在實際的工作中所謂的算法工程師,實際上大部分應該叫做“算法應用工程師”,很少有算法工程師能夠產生自己的算法。我這么說肯定有人要拍磚,但實際上確實是這樣的。比如做一些分類問題用邏輯回歸、SVM等常用算法,對于一些復雜問題,如圖像分類用CNN處理,稍微復雜一點的NLP問題用RNN處理。很多算法工程師日常工作大部分用在數據處理、訓練數據集選擇、校驗數據集選擇等,不斷的調節參數從而獲得較好的效果。這里不是詆毀那些努力工作的算法同學,我在研究生的時候也是搞機器學習的,工作后,先搞工程、又混合著搞算法,如分類問題,類目映射(將A網站的商品映射到B網站的類目下)、接著搞NLP(基于RNN和CRF做slotfilling)…,接著又搞工程…。我想說的是算法沒我們認為的那么復雜,但實際上又遠比我們認識的復雜。
為什么說算法不復雜卻又很復雜?其實這并不矛盾。說其不復雜是因為我們不必完全掌握背后復雜的公式推導,只需要知道背后的物理意義、知道響應的算法或模型適合處理的問題、知道如何調節相關的參數等即可。說其復雜是因為背后的推導確實很麻煩,就拿常用的SVM算法來說,讀書的時候硬生生的是照著PPT推導了一周才推導成功(也反映出自己數學基礎有點渣)…。繼續說復雜性,要非常純熟的掌握相應算法的核心,需要對線性代數、概率、微積分等重要的數學知識掌握和理解的較為透徹。這里不得不說我們的大學里相關的數學教育,感覺線性代數、概率、微積分講得不徹底,只是學了知識點但背后的物理意義卻沒能講清楚,比如矩陣相關運算的物理意義就是在實際的算法中才體會到的,數學真應該讓計算機老師來講。話說的有點多,但對于程序員來說我覺得數學知識必須要學的扎實,特別對于學校中的學生來說,其他課程可以不太用心,但數學相關必須牢牢地掌握,要用心,特別要掌握其背后的物理意義。
為什么我們要掌握算法呢?首先感覺是因為環境的變化,因為算法變得越來越重要,如之前的新聞,谷歌轉型:把2.5萬工程師變成機器學習專家,google都已經走在前列了,也足見機器學習越來越重要了。現在很多產品,工程只是對算法進行包裝,很多產品的核心是算法,如滴滴、Uber。
其次,工程師懂算法,真的有點像流氓會武術,誰也攔不住了。一方面增加自己的核心競爭力,另一方面在團隊溝通的時候也更加方便。很多算法工程師的架構、系統能力不足,如果工程師懂得算法,那么可以和算法同學順暢溝通,有助于產品或項目的實現。
最后,對于在校生、再找工作、畢業生或者剛工作的同學,能夠掌握機器學習的基本知識能夠增加你的核心競爭力,在競爭面前更容易脫穎而出(特別是在面試的時候,不一定要有實戰經驗,你能講的清楚也是很不錯的)。
總之,個人覺得,對于工程師而言,學習機器學習相關算法是提升個人核心競爭力的重要一步。那么接下來筆者就在這里進一步闡述作為工程師應該掌握哪些相關算法、如何去學習相關算法。
###2.基礎知識 — #####2.1 線性代數基礎知識 個人覺得線性代數知識是在工作中用的最廣的大學知識,特別是矩陣相關知識在實際應用中使用最為廣泛。但從個人經驗看,很多畢業生對于線性代數特別是矩陣相關知識掌握的很膚淺,對矩陣的理解很不到位,曾經問過一些畢業生,對于矩陣的SVD很多人會解,但背后的物理意義卻模糊不清。 講義鏈接:[Linear Algebra Review and Reference](http://ai-coder.com/batbus/pdf/cs229-linalg.pdf) #####2.2 概率基礎知識 概率知識是也是實際工作中使用較為廣泛的知識,從BAT的筆試題中可以看出,概率計算基本是逢考比用的。其中較為常用的就是貝葉斯定理了,在復習這部分的知識的時候,一定要弄清楚相關定理的前置條件。 講義鏈接:[Review of Probability Theory](http://ai-coder.com/batbus/pdf/cs229-prob.pdf) #####2.3 凸優化 在許多機器學習算法中,我們最終是求一個目標函數的最大值或最小值,很多時候這種問題最終歸咎為目標函數的優化問題,實質是一種凸優化問題,所以讀者需要掌握一些凸優化問題的基礎知識。 講義鏈接:[Convex Optimization Overview](http://ai-coder.com/batbus/pdf/cs229-cvxopt.pdf) ######注:講義來源于Stanford深度學習與NLP課程前置基礎知識 — ###3.應該了解哪些算法 這里不會對相關的算法做展開,只想從個人轉型的經歷向讀者闡述,應該掌握哪些常見的機器學習算法,以及學習中應該注意的事項。相關的算法以及有很多博客可以參考,但個人覺得還是要先讀一遍原論文,讀不懂沒關系,能理解多少理解多少,再參考別人寫的解釋理解一遍。如果直接讀別人的博客,有可能被誤導,之后再反過頭來再讀一讀原論文,這樣感覺理解的能好一些。當然也推薦大家直接學習Andrew Ng的公開課,講的比較容易懂。而且已經好幾年了,相關的討論、講義標注都很全面了,對于初學者來說是一個好的學習資源。 — ####3.1 常見的特征提取方法 其實特征選擇(提取)是作為監督學習中特別重要的一個環節。往往我們要處理的問題可能供處理的特征特別多,我們減少特征的數量,比如圖像處理,如果完全用像素,對于一張1000*1000的圖片,那么特征就是一個1000*1000這種高維的特征,我們需要降低這個特征的維度,這個過程就叫做特征提取(選擇)。對于圖像我們常用sift特征。常用的降維方法包括(個人常用): ######1.PCA(主成分分析) 這是一種無監督的降維方法,準確的說應該是一種空間映射方法,PCA一次尋找一組正交的映射空間,并且使得能夠在這個映射空間上方差最大。這個方法使用的頻率較高,也比較典型,比較容易掌握。一般的教材書中都有相關的介紹,在Andrew Ng的課程中有相關介紹,可以直接學習。 ######2.基于樹的方法 這里嗎需要讀者理解一些常用的概念如”熵”,”信息增益”等,基于樹的方法,可以通過剪枝的方式來去掉那些對于結果沒什么大的影響的特征。這里面對于”熵”的理解,要強調一下,”熵”可以理解為不確定性,你可以認為是”商量”,熵越大,不確定性越高,就越需要”商量”,越小,代表確定性越高。關于樹的相關方法,在國內的機器學習教材中都有明確的闡釋。
######3.SVD(矩陣分解) 矩陣分解這是機器學習里面非常重要的一個線性代數知識,能夠很好的起到降維的效果。在自然語言處理中較為常用。比如X是word-》document的矩陣,關于SVD雖然在公開課中有講解,但感覺還是語言的理解有問題,理解的不是很透徹,發現這個哥們寫的相關機器學習的博客講的還都比較通透,所以讀者可以參考他的這篇博文理解一下。
相關博文:強大的矩陣奇異值分解
####3.2 常用機器學習算法 這里面會向讀者介紹一下工作中常用的相關機器學習算法,當然這里也不會詳細解釋,這里只是告訴讀者存在并且常用這些算法,筆試和面試中往往會考察面試者對于這些知識的掌握。對于如何學習,筆者覺得最好優先讀paper,再看看公開課和相關博客。 ##### 3.2.1 常見聚類算法 聚類算法是我們常用的算法其思想比較容易理解,符合大腦處理問題的思維邏輯。我們常見的聚類算法包括Kmeans、EM算法等,下面簡單羅列一下: SimpleKmeans算法:接受輸入參數K,然后將數據集劃分為K歌聚簇,同一個聚簇中的相似度較高,不同聚簇的相似度較小。 Xmeans算法:Kmeans的改進,在總體中通過Kmeans產生聚類,再分別對每個聚類進行Kmeas的迭代,將某些子類進行聚類,直到達到用戶設定的次數為止。 EM算法:期望最大化算法(Expectation Maximization Algorithm),是一種迭代算法,用于含有隱變量(hidden variable)的概率參數模型的最大似然估計或極大后驗概率估計。這里需要說下,EM算法背后的理論、推導最好好好掌握,這個掌握了,大部分的推導和理論基本都cover了。 相關博文:[常用聚類算法介紹之聚類種類和算法列表](http://ai-coder.com/batbus/html/blog_detail.php?blog_id=250) ##### 3.2.2 常見分類、回歸算法 分類和回歸問題,其實可以拿到一起來講。如果我的問題最終是要將待處理的數據明確分為若干類別(常用的有二元分類、多元分類),那么就是分類問題,如果最終需要映射到一個數值區間,那么就是回歸問題,比如預測一個人犯罪的概率,如果需要判斷是否犯罪,那么就是一個分類問題(是和否),如果要給個概率那么就是一個回歸問題。 這里面我們常用的算法有SVM、LR、隨機森林、樸素貝葉斯。 線性回歸(Linear Regression):結果易于理解,計算上不復雜,但對非線性數據擬合不好。應該是線上應用最為廣泛的模型,簡約而不簡單,更重要的是快!LR的推導是必須要掌握的! SVM:通俗的講,SVM是一種二類分類模型,其模型的定義為特征空間上的間隔最大的線性分類器。其學習策略是使得間隔最大化,最終可以轉化為凸優化問題。簡單的理解就是,在低維空間中難以劃分的問題,將其映射到一個高維空間,在高維空間使得數據可以線性劃分。 樸素貝葉斯:樸素貝葉斯是貝葉斯理論的一部分,是一種概率模型,即選擇較高概率的決策。其前置條件是: (1)每個特征之間相互獨立。 (2)每個特征同等重要。 在數據較少的情況下仍然有效,可以處理多類別問題。但對于輸入數據較為敏感。 隨機森林(Random Forest):隨機森林比較適合做多分類問題,其優點是: 訓練和預測速度快; 對訓練數據的容錯能力好; 實現簡單且易并行 當數據集中有大比例的數據缺失時仍然可以保持精度不變和能夠有效地處理大的數據集;可以處理沒有刪減的成千上萬的變量;能夠在分類的過程中可以生成一個泛化誤差的內部無偏估計;能夠檢測到特征之間的相互影響以及重要性程度。但容易出現過度擬合。 實際上該算法實際上可以理解為專投票算法,一個森林可以拆解成很多樹,每個樹都是一個決策算法,可以理解成一個領域專家,眾多專家組合成一個森林,對于待處理的問題,專家組進行投票,最終少數服從多數,由票數決定結果。 ####3.3 深度學習相關算法 深度學習是近幾年較為火的一種學習方式,目前在實際工作中使用的越來越廣,往往不需要較為復雜的調優就能達到其他常用的調優過后的機器學習算法達到的水平,也就是說,他的baseline很高,隨著向caffee、tensorflow等框架使用的推廣,這些深度模型實現起來越來越簡單,所以工程師就越來越有必要掌握這些深度學習算法。你可以在機器上安裝tensorflow就能夠嘗試在本機上進行手寫體識別、word2Vector訓練等,趕緊動起來吧。 關于學習,可以參考Stanford深度學習和NLP的公開課,講的還比較透徹,但需要讀者掌握在文章第二部分提到的一些數學知識。 ##### 3.3.1 RNN(Recursive Neural Network) RNN是較為常用的深度模型,常用的有兩種變體,一種是時間遞歸神經網絡(Recurrent neural network),另一種是結構遞歸神經網絡(Recursive neural network)。時間遞歸神經網絡的神經元間連接構成有向圖,而結構遞歸神經網絡利用相似的神經網絡結構遞歸構造更為復雜的深度網絡。兩者訓練的算法不同,但屬于同一算法變體。 Recurrent是在時間維度的展開,能夠有效的表示信息在時間維度上從前往后的的傳遞和積累,你可以和馬爾科夫鏈做類比。 Recursive是在空間維度的展開,你可以認為他是一種結構上遞歸的結構,對應為棵樹。在NLP領域用的較為廣泛,能夠很好的提取出結構信息,其示意圖如下
二相比之下時間遞歸神經網絡如下:
##### 3.3.2 RNN(Recurrent Neural Network) 常見的示意圖如下所示,其核心就是每輪的運算都充分結合上一輪的迭代結果。
目前最為常見的時間遞歸神經網絡就是LSTM(Long-Short-Term-Memories)。按照時間序列進行展開如下圖
由上圖可見一般包括書入門、忘記門、輸出門,能夠很好的學習當前特征同時兼顧上下文信息。目前較多的用于NLP范疇,其能夠較好的保留上下文信息,這樣在語義理解、摘要生成、情感分析等問題處理上都能得到一個較好的結果。
讀者可以不去掌握其復雜的推導,但其背后的物理意義、這種思想是必須掌握的,應用的時候,大部分都是利用現有框架去處理。所以這里再強調一遍,如果精力有限那么就要重其意。
3.3.3 RNN模型比較
其實兩種模型的區別在3.3.1中已經做了區分,這里按照Stanford深度學習和NLP課程中所述進行一下模型對比。
Recursive Neural Network:在語言層解釋性較好,能夠保留骨干信息,可應用在句法分析、短語識別。
Recurrent Neural Network: 在語意上解釋性較好,很多人利用其做了很多好玩的,如自動寫詩之類的,訓練是一個個字符的讀取后訓練。通常情況下雖然不是最好的結果,但是結果也不差,特別是在引入了”門”之后,提示較為明顯。
3.3.4 CNN(Convolutional Neural network)
卷積神經網絡由于避免了對圖像的復雜前期預處理,可以直接輸入原始圖像(需要尺寸format處理),因而得到了更為廣泛的應用。
一般地,CNN的基本結構包括兩層,其一為特征提取層,每個神經元的輸入與前一層的局部接受域相連,并提取該局部的特征。一旦該局部特征被提取后,它與其它特征間的位置關系也隨之確定下來;其二是特征映射層,網絡的每個計算層由多個特征映射組成,每個特征映射是一個平面,平面上所有神經元的權值相等。
CNN主要用來識別位移、縮放及其他形式扭曲不變性的二維圖形。由于CNN的特征檢測層通過訓練數據進行學習,所以在使用CNN時,避免了顯示的特征抽取,而隱式地從訓練數據中進行學習。
這里讀者需要掌握卷積的物理意義、全鏈接和局部鏈接、知道為什么要池化、常見的池化方法等,這樣對CNN就基本掌握了,剩下的就是應用了。
4.總結
無論是學士還是已經工作的工程師,掌握一些機器學習算法,對于自己都是增加了自己的核心競爭力,在DT轉型的過程中,會讓自己走的更遠。如今無論是Google、微軟還是Amazon都在開放自己的機器學習平臺,阿里云上的機器學習平臺也可以直接使用,這些平臺的開放大大降低了我們對于算法的使用難度,我們無需向那些真正的算法專家一樣去發明算法,只要我們知其然、也知其所以然,就能夠利用這些知識去解決實際問題。
對于還在學校里學習的同學要充分利用自己的時間,在數學基礎上打撈,對常用的機器學習算法和深度學習算法都有所掌握。對于開源的tensorflow、caffee等代表性平臺和框架,要勇于嘗試,在未來的筆試和面試中一定會脫穎而出的。
-
工程師
+關注
關注
59文章
1566瀏覽量
68451 -
機器學習算法
+關注
關注
2文章
47瀏覽量
6451
發布評論請先 登錄
相關推薦
評論