怎樣成為一名優秀的演算法工程師

怎樣成為一名優秀的演算法工程師

來自專欄 SIGAI人工智慧講堂320 人贊了文章

原創聲明:本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不得轉載,不能用於商業目的。

怎樣成為一名優秀的演算法工程師?這是很多從事人工智慧學術研究和產品研發的同學都關心的一個問題。面對市場對人才的大量需求與供給的嚴重不足,以及高薪水的誘惑,越來越多的人開始學習這個方向的技術,或者打算向人工智慧轉型。市面上各種魚龍混雜的培訓班以及誤導人的文章會把很多初學者帶入歧途,浮躁的跟風將會讓你最後收穫甚微,根本達不到企業的用人要求。為了更好的幫助大家學習和成長,少走彎路,在今天的文章里,SIGAI的作者以自己的親身經歷和思考,為大家寫下對這一問題的理解與答案。

首先來看一個高度相關的問題:一個優秀的演算法工程師必須具備哪些素質?我們給出的答案是這樣的:

數學知識

編程能力

機器學習與深度學習的知識

應用方向的知識

對自己所做的問題的思考和經驗

除去教育背景,邏輯思維,學習能力,溝通能力等其他方面的因素,大多數公司在考察演算法工程師的技術水平時都會考慮上面這幾個因素。接下來我們將按照這幾個方面進行展開,詳細的說明如何學習這些方面的知識以及積累經驗。

數學知識

與其他工作方向如app、伺服器開發相比,以及與計算機科學的其他方向如網路,資料庫,分散式計算等相比,人工智慧尤其是機器學習屬於數學知識密集的方向。在各種書籍,論文,演算法中都充斥著大量的數學公式,這讓很多打算入門的人或者開始學習的人感到明顯的壓力。首先我們考慮一個最核心的問題:機器學習和深度學習究竟需要哪些數學知識?在SIGAI之前的公眾號文章「學好機器學習需要哪些數學知識」里,我們已經給出了答案。先看下面這張表:

更多演算法工程師的必讀文章,請關注SIGAICN公眾號

上面的表給出了各種典型的機器學習演算法所用到的數學知識點。我們之前已經總結過,理解絕大多數演算法和理論,有微積分/高等數學,線性代數,概率論,最優化方法的知識就夠了。除流形學習需要簡單的微分幾何概念之外,深層次的數學知識如實變函數,泛函分析等主要用在一些基礎理論結果的證明上,即使不能看懂證明過程,也不影響我們使用具體的機器學習演算法。概率圖模型、流形學習中基於圖的模型會用到圖論的一些基本知識,如果學習過離散數學或者數據結構,這些概念很容易理解。除此之外,某些演算法會用到離散數學中的樹的概念,但很容易理解。

如果你已經學過這些大學數學課,只要把所需的知識點複習一遍就夠了。對於微積分,通俗易懂而又被廣為採用的是同濟版的高等數學:

在機器學習中主要用到了微分部分,積分用的非常少。具體的,用到了下面的概念:

導數和偏導數的定義與計算方法,與函數性質的關係

梯度向量的定義

極值定理,可導函數在極值點處導數或梯度必須為0

雅克比矩陣,這是向量到向量映射函數的偏導數構成的矩陣,在求導推導中會用到

Hessian矩陣,這是2階導數對多元函數的推廣,與函數的極值有密切的聯繫

凸函數的定義與判斷方法

泰勒展開公式

拉格朗日乘數法,用於求解帶等式約束的極值問題

其中最核心的是多元函數的泰勒展開公式,根據它我們可以推導出梯度下降法,牛頓法,擬牛頓法等一系列最優化方法。如果你想要深入的學習微積分,可以閱讀數學系的教程,稱為數學分析:

與工科的高等數學偏重計算不同,它裡面有大量的理論證明,對於鍛煉數學思維非常有幫助。北大張築生先生所著的數學分析可謂是國內這方面教材的精品。

下面來看線性代數,同樣是同濟版的教材:

如果想更全面系統的學習線性代數,可以看這本書:

相比之下,線性代數用的更多。具體用到的知識點有:

向量和它的各種運算,包括加法,減法,數乘,轉置,內積

向量和矩陣的範數,L1範數和L2範數

矩陣和它的各種運算,包括加法,減法,乘法,數乘

逆矩陣的定義與性質

行列式的定義與計算方法

二次型的定義

矩陣的正定性

特徵值與特徵向量

奇異值分解

線性方程組的數值解

機器學習演算法處理的數據一般都是向量、矩陣或者張量。經典的機器學習演算法輸入的數據都是特徵向量,深度學習演算法在處理圖像時輸入的2維的矩陣或者3維的張量。掌握這些概念是你理解機器學習和深度學習演算法的基礎。

概率論國內理工科專業使用最多的是浙大版的教材:

如果把機器學習所處理的樣本數據看作隨機變數/向量,就可以用概率論的方法對問題進行建模,這代表了機器學習中很大一類方法。在機器學習里用到的概率論知識點有:

隨機事件的概念,概率的定義與計算方法

隨機變數與概率分布,尤其是連續型隨機變數的概率密度函數和分布函數

條件概率與貝葉斯公式

常用的概率分布,包括正態分布,伯努利二項分布,均勻分布

隨機變數的均值與方差,協方差

隨機變數的獨立性

最大似然估計

這些知識不超出普通理工科概率論教材的範圍。

最後來說最優化,幾乎所有機器學習演算法歸根到底都是在求解最優化問題。求解最優化問題的指導思想是在極值點出函數的導數/梯度必須為0。因此你必須理解梯度下降法,牛頓法這兩種常用的演算法,它們的迭代公式都可以從泰勒展開公式而得到。

凸優化是機器學習中經常會提及的一個概念,這是一類特殊的優化問題,它的優化變數的可行域是凸集,目標函數是凸函數。凸優化最好的性質是它的所有局部最優解就是全局最優解,因此求解時不會陷入局部最優解。如果一個問題被證明為是凸優化問題,基本上已經宣告此問題得到了解決。在機器學習中,線性回歸、嶺回歸、支持向量機、logistic回歸等很多演算法求解的都是凸優化問題。

拉格朗日對偶為帶等式和不等式約束條件的優化問題構造拉格朗日函數,將其變為原問題,這兩個問題是等價的。通過這一步變換,將帶約束條件的問題轉換成不帶約束條件的問題。通過變換原始優化變數和拉格朗日乘子的優化次序,進一步將原問題轉換為對偶問題,如果滿足某種條件,原問題和對偶問題是等價的。這種方法的意義在於可以將一個不易於求解的問題轉換成更容易求解的問題。在支持向量機中有拉格朗日對偶的應用。

KKT條件是拉格朗日乘數法對帶不等式約束問題的推廣,它給出了帶等式和不等式約束的優化問題在極值點處所必須滿足的條件。在支持向量機中也有它的應用。

如果你沒有學過最優化方法這門課也不用擔心,這些方法根據微積分和線性代數的基礎知識可以很容易推導出來。如果需要系統的學習這方面的知識,可以閱讀《凸優化》,《非線性規劃》兩本經典教材。

編程能力

編程能力是學好機器學習和深度學習的又一大基礎。對於計算機類專業的學生,由於本科已經學了c語言,c++,數據結構與演算法,因此這方面一般不存在問題。對於非計算機專業的人來說,要真正學好機器學習和深度學習,這些知識是繞不開的。

雖然現在大家熱衷於學習python,但要作為一名真正的演算法工程師,還是應該好好學習一下c++,至少,機器學習和深度學習的很多底層開源庫都是用它寫的;很多公司線上的產品,無論是運行在伺服器端,還是嵌入式端,都是用c++寫的。此外,如果你是應屆生,在校園招聘時不少公司都會面試你c++的知識。

C++最經典的教材無疑是c++ primer:

對做演算法的人來說,這本書其實不用全部看,把常用的點學完就夠了。對於進階,Effective c++是很好的選擇,不少公司的面試題就直接出自這本書的知識點:

接下來說python,相比c++來說,學習的門檻要低很多,找一本通俗易懂的入門教程學習一遍即可。

數據結構和演算法是編寫很多程序的基礎,對於機器學習和深度學習程序也不例外。很多演算法的實現都依賴於數組,鏈表,數,排序,查找之類的數據結構和基礎演算法。如果有時間和精力,把演算法導論啃一遍,你會有不一樣的感受:

對於應屆生來說,學完它對於你通過大互聯網和人工智慧公司校園招聘的技術面試也非常有用。

上面說的只是編程語言的程序設計的理論知識,我們還要考慮實際動手能力。對於開發環境如gcc/g++,visual studio之類的工具,以及gdb之類的調試工具需要做到熟練使用。如果是在linux上開發,對linux的常用命令也要熟記於心。這方面的知識看各種具體的知識點和教程即可。另外,對於編程的一些常識,如進程,線程,虛擬內存,文件系統等,你最好也要進行了解。

機器學習與深度學習

在說完了數學和編程基礎之後,下面我來看核心的內容,機器學習和深度學習知識。機器學習是現階段解決很多人工智慧問題的核心方法,尤其是深度學習,因此它們是演算法工程師的核心知識。在這裡有一個問題:是否需要先學機器學習,還是直接學深度學習?如果是一個專業的演算法工程師,我的建議是先學機器學習。至少,你要知道機器學習中的基本概念,過擬合,生成模型,ROC曲線等,上來就看深度學習,如沒有背景知識你將不知所云。另外,神經網路只是機器學習中的一類方法,對於很多問題,其他機器學習演算法如logistic回歸,隨機森林,GBDT,決策樹等還在被大規模使用,因此你不要把自己局限在神經網路的小圈子裡。

首先來看機器學習,這方面的教材很多,周志華老師的機器學習,李航老師的統計學習方法是國內的經典。這裡我們介紹國外的經典教材,首先是PRML:

此書深厚,內容全面,涵蓋了有監督學習,無監督學習的主要方法,理論推導和證明詳細深入,是機器學習的經典。此外還有模式分類這本書,在這裡不詳細介紹。

深度學習目前最權威的教程是下面這本書:

它涵蓋了深度學習的方方面面,從理論到工程,但美中不足的是對應於介紹的相對較少。

強化學習是機器學習很獨特的一個分支,大多數人對它不太了解,這方面的教程非常少,我們推薦下面這本書:

美中不足的是這本書對深度強化學習沒有介紹,因為出版的較早。不知最新的版本有沒有加上這方面的內容。

在這裡需要強調的是,你的知識要系統化,有整體感。很多同學都感覺到自己學的機器學習太零散,缺乏整體感。這需要你多思考演算法之間的關係,演化歷史之類的問題,這樣你就做到胸中有圖-機器學習演算法地圖。其實,SIGAI在之前的公眾號文章「機器學習演算法地圖」里已經給你總結出來了。

開源庫

上面介紹了機器學習和深度學習的理論教材,下面來說實踐問題。我們無需重複造車輪子,熟練的使用主流的開源庫是需要掌握的一項技能。對於經典的機器學習,常用的庫的有:

libsvm

liblinear

XGBoost

OpenCV

HTK

Weka

在這裡我們不一一列舉。藉助於這些庫,我們可以方便的完成自己的實驗,或是研發自己的產品。對於深度學習,目前常用的有:

Caffe

TensorFlow

MXNet

除此之外,還有其他的。對於你要用到的開源庫,一定要理解它的原理,以及使用中的一些細節問題。例如很多演算法要求輸入的數據先做歸一化,否則效果會非常差,而且面臨浮點數溢出的問題,這些實際經驗需要你在使用中摸索。如果有精力把這些庫的核心代碼分析一遍,你對實現機器學習演算法將會更有底氣。以深度學習為例,最核心的代碼無非是實現:

各種層,包括它們的正向傳播和反向傳播

激活函數的實現

損失函數的實現

輸入數據的處理

求解器,實現各種梯度下降法

這些代碼的量並不大,沉下心來,我相信一周之內肯定能分析完。看完之後你會有一種豁然開朗的感覺。

應用方向的知識

接下來是各個方向的知識,與機器學習有關的應用方向當前主要有:

機器視覺

語音識別

自然語言處理

數據挖掘

知識圖譜

推薦系統

除此之外,還有其他一些特定小方向,在這裡不一一列舉。這些具體的應用方向一般都有自己的教材,如果你以後要從事此方向的研究,系統的學習一遍是必須的。

實踐經驗與思考

在說完理論與實踐知識之後,最後我們來說經驗與思考。在你確定要做某一個方向之後,對這個方向的方法要有一個全面系統的認識,很多方法是一脈相承的,如果只追求時髦看最新的演算法,你很難做出學術上的創新,以及工程上的優化。對於本問題所有的經典論文,都應該化時間細度,清楚的理解它們解決了什麼問題,是怎麼解決的,還有哪些問題沒有解決。例如:

機器視覺目標檢測中的遮擋問題

推薦系統中的冷啟動問題

自然語言處理中文分詞中的歧義切分問題

只有經過大量的編程和實驗訓練,以及持續的思考,你才能算得上對這個方向深刻理解,以至於有自己的理解。很多同學對自己實現輪上的演算法沒有底氣,解決這個問題最快的途徑就是看論文演算法的開源代碼,在github上有豐富的資源,選擇一些合適的,研究一下別人是怎麼實現的,你就能明白怎麼實現自己的網路結構和損失函數,照葫蘆畫瓢即可。

計算機以及人工智慧是一個偏實踐的學科,它的方法和理論既需要我們有紮實的理論功底,又需要有豐富的實踐能力與經驗。這兩個方面構成了演算法工程師最主要的素質。科學的學習路徑能夠讓你取得好的學習效果,同時也縮短學習時間。錯誤和浮躁的做法則會讓你最後事倍功半。這是SIGAI對想進入這個領域,或者剛進入這個領域的每個人要說的!

推薦閱讀

[1] 機器學習-波瀾壯闊40年 SIGAI 2018.4.13.

[2] 學好機器學習需要哪些數學知識?SIGAI 2018.4.17.

[3] 人臉識別演算法演化史 SIGAI 2018.4.20.

[4] 基於深度學習的目標檢測演算法綜述 SIGAI 2018.4.24.

[5] 卷積神經網路為什麼能夠稱霸計算機視覺領域? SIGAI 2018.4.26.

[6] 用一張圖理解SVM的脈絡 SIGAI 2018.4.28.

[7] 人臉檢測演算法綜述 SIGAI 2018.5.3.

[8] 理解神經網路的激活函數 SIGAI 2018.5.5.

[9] 深度卷積神經網路演化歷史及結構改進脈絡-40頁長文全面解讀 SIGAI 2018.5.8.

[10] 理解梯度下降法 SIGAI 2018.5.11.

[11] 循環神經網路綜述—語音識別與自然語言處理的利器 SIGAI 2018.5.15

[12] 理解凸優化 SIGAI 2018.5.18

[13] 【實驗】理解SVM的核函數和參數 SIGAI 2018.5.22

[14] 【SIGAI綜述】行人檢測演算法 SIGAI 2018.5.25

[15] 機器學習在自動駕駛中的應用—以百度阿波羅平台為例(上) SIGAI 2018.5.29

[16] 理解牛頓法 SIGAI 2018.5.31

[17] 【群話題精華】5月集錦—機器學習和深度學習中一些值得思考的問題 SIGAI 2018.6.1

[18] 大話Adaboost演算法 SIGAI 2018.6.2

[19] FlowNet到FlowNet2.0:基於卷積神經網路的光流預測演算法 SIGAI 2018.6.4

[20] 理解主成分分析(PCA) SIGAI 2018.6.6

[21] 人體骨骼關鍵點檢測綜述 SIGAI 2018.6.8

[22] 理解決策樹 SIGAI 2018.6.11

[23] 用一句話總結常用的機器學習演算法 SIGAI 2018.6.13

[24] 目標檢測演算法之YOLO SIGAI 2018.6.15

[25] 理解過擬合 SIGAI 2018.6.18

[26] 理解計算:從√2到AlphaGo ——第1季 從√2談起 SIGAI 2018.6.20

[27] 場景文本檢測——CTPN演算法介紹 SIGAI 2018.6.22

[28] 卷積神經網路的壓縮和加速 SIGAI 2018.6.25

[29] k近鄰演算法 SIGAI 2018.6.27

[30] 自然場景文本檢測識別技術綜述 SIGAI 2018.6.27

[31] 理解計算:從√2到AlphaGo ——第2季 神經計算的歷史背景 SIGAI 2018.7.4

[32] 機器學習演算法地圖 SIGAI2018.7.6

[33] 反向傳播演算法推導-全連接神經網路 SIGAI2018.7.9

[34] 生成式對抗網路模型綜述 SIGAI2018.7.11

原創聲明:本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不得轉載,不能用於商業目的。


推薦閱讀:

2.1 可行性研究
軟體測試經典sql面試題(學生表_課程表_成績表_教師表)
3.4 需求分析中的圖
用什麼語言最容易通過白板面試?面試時間越久就越容易過嗎?

TAG:機器學習 | 演算法工程師 | 軟體工程師 |