導(dǎo)言
怎樣成為一名優(yōu)秀的算法工程師?這是很多從事人工智能學(xué)術(shù)研究和產(chǎn)品研發(fā)的同學(xué)都關(guān)心的一個(gè)問(wèn)題。面對(duì)市場(chǎng)對(duì)人才的大量需求與供給的嚴(yán)重不足,以及高薪水的誘惑,越來(lái)越多的人開(kāi)始學(xué)習(xí)這個(gè)方向的技術(shù),或者打算向人工智能轉(zhuǎn)型。市面上各種魚龍混雜的培訓(xùn)班以及誤導(dǎo)人的文章會(huì)把很多初學(xué)者帶入歧途,浮躁的跟風(fēng)將會(huì)讓你最后收獲甚微,根本達(dá)不到企業(yè)的用人要求。為了更好的幫助大家學(xué)習(xí)和成長(zhǎng),少走彎路,在今天的文章里,SIGAI的作者以自己的親身經(jīng)歷和思考,為大家寫下對(duì)這一問(wèn)題的理解與答案。
首先來(lái)看一個(gè)高度相關(guān)的問(wèn)題:一個(gè)優(yōu)秀的算法工程師必須具備哪些素質(zhì)?我們給出的答案是這樣的:
數(shù)學(xué)知識(shí)
編程能力
機(jī)器學(xué)習(xí)與深度學(xué)習(xí)的知識(shí)
應(yīng)用方向的知識(shí)
對(duì)自己所做的問(wèn)題的思考和經(jīng)驗(yàn)
除去教育背景,邏輯思維,學(xué)習(xí)能力,溝通能力等其他方面的因素,大多數(shù)公司在考察算法工程師的技術(shù)水平時(shí)都會(huì)考慮上面這幾個(gè)因素。接下來(lái)我們將按照這幾個(gè)方面進(jìn)行展開(kāi),詳細(xì)的說(shuō)明如何學(xué)習(xí)這些方面的知識(shí)以及積累經(jīng)驗(yàn)。
數(shù)學(xué)知識(shí)
與其他工作方向如app、服務(wù)器開(kāi)發(fā)相比,以及與計(jì)算機(jī)科學(xué)的其他方向如網(wǎng)絡(luò),數(shù)據(jù)庫(kù),分布式計(jì)算等相比,人工智能尤其是機(jī)器學(xué)習(xí)屬于數(shù)學(xué)知識(shí)密集的方向。在各種書籍,論文,算法中都充斥著大量的數(shù)學(xué)公式,這讓很多打算入門的人或者開(kāi)始學(xué)習(xí)的人感到明顯的壓力。首先我們考慮一個(gè)最核心的問(wèn)題:機(jī)器學(xué)習(xí)和深度學(xué)習(xí)究竟需要哪些數(shù)學(xué)知識(shí)?在SIGAI之前的公眾號(hào)文章“學(xué)好機(jī)器學(xué)習(xí)需要哪些數(shù)學(xué)知識(shí)”里,我們已經(jīng)給出了答案。先看下面這張表:
更多算法工程師的必讀文章,請(qǐng)關(guān)注SIGAICN公眾號(hào)
上面的表給出了各種典型的機(jī)器學(xué)習(xí)算法所用到的數(shù)學(xué)知識(shí)點(diǎn)。我們之前已經(jīng)總結(jié)過(guò),理解絕大多數(shù)算法和理論,有微積分/高等數(shù)學(xué),線性代數(shù),概率論,最優(yōu)化方法的知識(shí)就夠了。除流形學(xué)習(xí)需要簡(jiǎn)單的微分幾何概念之外,深層次的數(shù)學(xué)知識(shí)如實(shí)變函數(shù),泛函分析等主要用在一些基礎(chǔ)理論結(jié)果的證明上,即使不能看懂證明過(guò)程,也不影響我們使用具體的機(jī)器學(xué)習(xí)算法。概率圖模型、流形學(xué)習(xí)中基于圖的模型會(huì)用到圖論的一些基本知識(shí),如果學(xué)習(xí)過(guò)離散數(shù)學(xué)或者數(shù)據(jù)結(jié)構(gòu),這些概念很容易理解。除此之外,某些算法會(huì)用到離散數(shù)學(xué)中的樹(shù)的概念,但很容易理解。
如果你已經(jīng)學(xué)過(guò)這些大學(xué)數(shù)學(xué)課,只要把所需的知識(shí)點(diǎn)復(fù)習(xí)一遍就夠了。對(duì)于微積分,通俗易懂而又被廣為采用的是同濟(jì)版的高等數(shù)學(xué):
在機(jī)器學(xué)習(xí)中主要用到了微分部分,積分用的非常少。具體的,用到了下面的概念:
導(dǎo)數(shù)和偏導(dǎo)數(shù)的定義與計(jì)算方法,與函數(shù)性質(zhì)的關(guān)系
梯度向量的定義
極值定理,可導(dǎo)函數(shù)在極值點(diǎn)處導(dǎo)數(shù)或梯度必須為0
雅克比矩陣,這是向量到向量映射函數(shù)的偏導(dǎo)數(shù)構(gòu)成的矩陣,在求導(dǎo)推導(dǎo)中會(huì)用到
Hessian矩陣,這是2階導(dǎo)數(shù)對(duì)多元函數(shù)的推廣,與函數(shù)的極值有密切的聯(lián)系
凸函數(shù)的定義與判斷方法
泰勒展開(kāi)公式
拉格朗日乘數(shù)法,用于求解帶等式約束的極值問(wèn)題
其中最核心的是多元函數(shù)的泰勒展開(kāi)公式,根據(jù)它我們可以推導(dǎo)出梯度下降法,牛頓法,擬牛頓法等一系列最優(yōu)化方法。
如果你想要深入的學(xué)習(xí)微積分,可以閱讀數(shù)學(xué)系的教程,稱為數(shù)學(xué)分析:
與工科的高等數(shù)學(xué)偏重計(jì)算不同,它里面有大量的理論證明,對(duì)于鍛煉數(shù)學(xué)思維非常有幫助。北大張筑生先生所著的數(shù)學(xué)分析可謂是國(guó)內(nèi)這方面教材的精品。
下面來(lái)看線性代數(shù),同樣是同濟(jì)版的教材:
如果想更全面系統(tǒng)的學(xué)習(xí)線性代數(shù),可以看這本書:
相比之下,線性代數(shù)用的更多。具體用到的知識(shí)點(diǎn)有:
向量和它的各種運(yùn)算,包括加法,減法,數(shù)乘,轉(zhuǎn)置,內(nèi)積
向量和矩陣的范數(shù),L1范數(shù)和L2范數(shù)
矩陣和它的各種運(yùn)算,包括加法,減法,乘法,數(shù)乘
逆矩陣的定義與性質(zhì)
行列式的定義與計(jì)算方法
二次型的定義
矩陣的正定性
特征值與特征向量
奇異值分解
線性方程組的數(shù)值解
機(jī)器學(xué)習(xí)算法處理的數(shù)據(jù)一般都是向量、矩陣或者張量。經(jīng)典的機(jī)器學(xué)習(xí)算法輸入的數(shù)據(jù)都是特征向量,深度學(xué)習(xí)算法在處理圖像時(shí)輸入的2維的矩陣或者3維的張量。掌握這些概念是你理解機(jī)器學(xué)習(xí)和深度學(xué)習(xí)算法的基礎(chǔ)。
概率論國(guó)內(nèi)理工科專業(yè)使用最多的是浙大版的教材:
如果把機(jī)器學(xué)習(xí)所處理的樣本數(shù)據(jù)看作隨機(jī)變量/向量,就可以用概率論的方法對(duì)問(wèn)題進(jìn)行建模,這代表了機(jī)器學(xué)習(xí)中很大一類方法。在機(jī)器學(xué)習(xí)里用到的概率論知識(shí)點(diǎn)有:
隨機(jī)事件的概念,概率的定義與計(jì)算方法
隨機(jī)變量與概率分布,尤其是連續(xù)型隨機(jī)變量的概率密度函數(shù)和分布函數(shù)
條件概率與貝葉斯公式
常用的概率分布,包括正態(tài)分布,伯努利二項(xiàng)分布,均勻分布
隨機(jī)變量的均值與方差,協(xié)方差
隨機(jī)變量的獨(dú)立性
最大似然估計(jì)
這些知識(shí)不超出普通理工科概率論教材的范圍。
最后來(lái)說(shuō)最優(yōu)化,幾乎所有機(jī)器學(xué)習(xí)算法歸根到底都是在求解最優(yōu)化問(wèn)題。求解最優(yōu)化問(wèn)題的指導(dǎo)思想是在極值點(diǎn)出函數(shù)的導(dǎo)數(shù)/梯度必須為0。因此你必須理解梯度下降法,牛頓法這兩種常用的算法,它們的迭代公式都可以從泰勒展開(kāi)公式而得到。
凸優(yōu)化是機(jī)器學(xué)習(xí)中經(jīng)常會(huì)提及的一個(gè)概念,這是一類特殊的優(yōu)化問(wèn)題,它的優(yōu)化變量的可行域是凸集,目標(biāo)函數(shù)是凸函數(shù)。凸優(yōu)化最好的性質(zhì)是它的所有局部最優(yōu)解就是全局最優(yōu)解,因此求解時(shí)不會(huì)陷入局部最優(yōu)解。如果一個(gè)問(wèn)題被證明為是凸優(yōu)化問(wèn)題,基本上已經(jīng)宣告此問(wèn)題得到了解決。在機(jī)器學(xué)習(xí)中,線性回歸、嶺回歸、支持向量機(jī)、logistic回歸等很多算法求解的都是凸優(yōu)化問(wèn)題。
拉格朗日對(duì)偶為帶等式和不等式約束條件的優(yōu)化問(wèn)題構(gòu)造拉格朗日函數(shù),將其變?yōu)樵瓎?wèn)題,這兩個(gè)問(wèn)題是等價(jià)的。通過(guò)這一步變換,將帶約束條件的問(wèn)題轉(zhuǎn)換成不帶約束條件的問(wèn)題。通過(guò)變換原始優(yōu)化變量和拉格朗日乘子的優(yōu)化次序,進(jìn)一步將原問(wèn)題轉(zhuǎn)換為對(duì)偶問(wèn)題,如果滿足某種條件,原問(wèn)題和對(duì)偶問(wèn)題是等價(jià)的。這種方法的意義在于可以將一個(gè)不易于求解的問(wèn)題轉(zhuǎn)換成更容易求解的問(wèn)題。在支持向量機(jī)中有拉格朗日對(duì)偶的應(yīng)用。
KKT條件是拉格朗日乘數(shù)法對(duì)帶不等式約束問(wèn)題的推廣,它給出了帶等式和不等式約束的優(yōu)化問(wèn)題在極值點(diǎn)處所必須滿足的條件。在支持向量機(jī)中也有它的應(yīng)用。
如果你沒(méi)有學(xué)過(guò)最優(yōu)化方法這門課也不用擔(dān)心,這些方法根據(jù)微積分和線性代數(shù)的基礎(chǔ)知識(shí)可以很容易推導(dǎo)出來(lái)。如果需要系統(tǒng)的學(xué)習(xí)這方面的知識(shí),可以閱讀《凸優(yōu)化》,《非線性規(guī)劃》兩本經(jīng)典教材。
編程能力
編程能力是學(xué)好機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的又一大基礎(chǔ)。對(duì)于計(jì)算機(jī)類專業(yè)的學(xué)生,由于本科已經(jīng)學(xué)了c語(yǔ)言,c++,數(shù)據(jù)結(jié)構(gòu)與算法,因此這方面一般不存在問(wèn)題。對(duì)于非計(jì)算機(jī)專業(yè)的人來(lái)說(shuō),要真正學(xué)好機(jī)器學(xué)習(xí)和深度學(xué)習(xí),這些知識(shí)是繞不開(kāi)的。
雖然現(xiàn)在大家熱衷于學(xué)習(xí)python,但要作為一名真正的算法工程師,還是應(yīng)該好好學(xué)習(xí)一下c++,至少,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的很多底層開(kāi)源庫(kù)都是用它寫的;很多公司線上的產(chǎn)品,無(wú)論是運(yùn)行在服務(wù)器端,還是嵌入式端,都是用c++寫的。此外,如果你是應(yīng)屆生,在校園招聘時(shí)不少公司都會(huì)面試你c++的知識(shí)。
C++最經(jīng)典的教材無(wú)疑是c++ primer:
對(duì)做算法的人來(lái)說(shuō),這本書其實(shí)不用全部看,把常用的點(diǎn)學(xué)完就夠了。對(duì)于進(jìn)階,Effective c++是很好的選擇,不少公司的面試題就直接出自這本書的知識(shí)點(diǎn):
接下來(lái)說(shuō)python,相比c++來(lái)說(shuō),學(xué)習(xí)的門檻要低很多,找一本通俗易懂的入門教程學(xué)習(xí)一遍即可。
數(shù)據(jù)結(jié)構(gòu)和算法是編寫很多程序的基礎(chǔ),對(duì)于機(jī)器學(xué)習(xí)和深度學(xué)習(xí)程序也不例外。很多算法的實(shí)現(xiàn)都依賴于數(shù)組,鏈表,數(shù),排序,查找之類的數(shù)據(jù)結(jié)構(gòu)和基礎(chǔ)算法。如果有時(shí)間和精力,把算法導(dǎo)論啃一遍,你會(huì)有不一樣的感受:
對(duì)于應(yīng)屆生來(lái)說(shuō),學(xué)完它對(duì)于你通過(guò)大互聯(lián)網(wǎng)和人工智能公司校園招聘的技術(shù)面試也非常有用。
上面說(shuō)的只是編程語(yǔ)言的程序設(shè)計(jì)的理論知識(shí),我們還要考慮實(shí)際動(dòng)手能力。對(duì)于開(kāi)發(fā)環(huán)境如gcc/g++,visual studio之類的工具,以及gdb之類的調(diào)試工具需要做到熟練使用。如果是在linux上開(kāi)發(fā),對(duì)linux的常用命令也要熟記于心。這方面的知識(shí)看各種具體的知識(shí)點(diǎn)和教程即可。另外,對(duì)于編程的一些常識(shí),如進(jìn)程,線程,虛擬內(nèi)存,文件系統(tǒng)等,你最好也要進(jìn)行了解。
機(jī)器學(xué)習(xí)與深度學(xué)習(xí)
在說(shuō)完了數(shù)學(xué)和編程基礎(chǔ)之后,下面我來(lái)看核心的內(nèi)容,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)知識(shí)。機(jī)器學(xué)習(xí)是現(xiàn)階段解決很多人工智能問(wèn)題的核心方法,尤其是深度學(xué)習(xí),因此它們是算法工程師的核心知識(shí)。在這里有一個(gè)問(wèn)題:是否需要先學(xué)機(jī)器學(xué)習(xí),還是直接學(xué)深度學(xué)習(xí)?如果是一個(gè)專業(yè)的算法工程師,我的建議是先學(xué)機(jī)器學(xué)習(xí)。至少,你要知道機(jī)器學(xué)習(xí)中的基本概念,過(guò)擬合,生成模型,ROC曲線等,上來(lái)就看深度學(xué)習(xí),如沒(méi)有背景知識(shí)你將不知所云。另外,神經(jīng)網(wǎng)絡(luò)只是機(jī)器學(xué)習(xí)中的一類方法,對(duì)于很多問(wèn)題,其他機(jī)器學(xué)習(xí)算法如logistic回歸,隨機(jī)森林,GBDT,決策樹(shù)等還在被大規(guī)模使用,因此你不要把自己局限在神經(jīng)網(wǎng)絡(luò)的小圈子里。
首先來(lái)看機(jī)器學(xué)習(xí),這方面的教材很多,周志華老師的機(jī)器學(xué)習(xí),李航老師的統(tǒng)計(jì)學(xué)習(xí)方法是國(guó)內(nèi)的經(jīng)典。這里我們介紹國(guó)外的經(jīng)典教材,首先是PRML:
此書深厚,內(nèi)容全面,涵蓋了有監(jiān)督學(xué)習(xí),無(wú)監(jiān)督學(xué)習(xí)的主要方法,理論推導(dǎo)和證明詳細(xì)深入,是機(jī)器學(xué)習(xí)的經(jīng)典。此外還有模式分類這本書,在這里不詳細(xì)介紹。
深度學(xué)習(xí)目前最權(quán)威的教程是下面這本書:
它涵蓋了深度學(xué)習(xí)的方方面面,從理論到工程,但美中不足的是對(duì)應(yīng)于介紹的相對(duì)較少。
強(qiáng)化學(xué)習(xí)是機(jī)器學(xué)習(xí)很獨(dú)特的一個(gè)分支,大多數(shù)人對(duì)它不太了解,這方面的教程非常少,我們推薦下面這本書:
美中不足的是這本書對(duì)深度強(qiáng)化學(xué)習(xí)沒(méi)有介紹,因?yàn)槌霭娴妮^早。不知最新的版本有沒(méi)有加上這方面的內(nèi)容。
在這里需要強(qiáng)調(diào)的是,你的知識(shí)要系統(tǒng)化,有整體感。很多同學(xué)都感覺(jué)到自己學(xué)的機(jī)器學(xué)習(xí)太零散,缺乏整體感。這需要你多思考算法之間的關(guān)系,演化歷史之類的問(wèn)題,這樣你就做到胸中有圖-機(jī)器學(xué)習(xí)算法地圖。其實(shí),SIGAI在之前的公眾號(hào)文章“機(jī)器學(xué)習(xí)算法地圖”里已經(jīng)給你總結(jié)出來(lái)了。
開(kāi)源庫(kù)
上面介紹了機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的理論教材,下面來(lái)說(shuō)實(shí)踐問(wèn)題。我們無(wú)需重復(fù)造車輪子,熟練的使用主流的開(kāi)源庫(kù)是需要掌握的一項(xiàng)技能。對(duì)于經(jīng)典的機(jī)器學(xué)習(xí),常用的庫(kù)的有:
libsvm
liblinear
XGBoost
OpenCV
HTK
Weka
在這里我們不一一列舉。借助于這些庫(kù),我們可以方便的完成自己的實(shí)驗(yàn),或是研發(fā)自己的產(chǎn)品。對(duì)于深度學(xué)習(xí),目前常用的有:
Caffe
MXNet
除此之外,還有其他的。對(duì)于你要用到的開(kāi)源庫(kù),一定要理解它的原理,以及使用中的一些細(xì)節(jié)問(wèn)題。例如很多算法要求輸入的數(shù)據(jù)先做歸一化,否則效果會(huì)非常差,而且面臨浮點(diǎn)數(shù)溢出的問(wèn)題,這些實(shí)際經(jīng)驗(yàn)需要你在使用中摸索。如果有精力把這些庫(kù)的核心代碼分析一遍,你對(duì)實(shí)現(xiàn)機(jī)器學(xué)習(xí)算法將會(huì)更有底氣。以深度學(xué)習(xí)為例,最核心的代碼無(wú)非是實(shí)現(xiàn):
各種層,包括它們的正向傳播和反向傳播
激活函數(shù)的實(shí)現(xiàn)
損失函數(shù)的實(shí)現(xiàn)
輸入數(shù)據(jù)的處理
求解器,實(shí)現(xiàn)各種梯度下降法
這些代碼的量并不大,沉下心來(lái),我相信一周之內(nèi)肯定能分析完。看完之后你會(huì)有一種豁然開(kāi)朗的感覺(jué)。
應(yīng)用方向的知識(shí)
接下來(lái)是各個(gè)方向的知識(shí),與機(jī)器學(xué)習(xí)有關(guān)的應(yīng)用方向當(dāng)前主要有:
自然語(yǔ)言處理
數(shù)據(jù)挖掘
知識(shí)圖譜
推薦系統(tǒng)
除此之外,還有其他一些特定小方向,在這里不一一列舉。這些具體的應(yīng)用方向一般都有自己的教材,如果你以后要從事此方向的研究,系統(tǒng)的學(xué)習(xí)一遍是必須的。
實(shí)踐經(jīng)驗(yàn)與思考
在說(shuō)完理論與實(shí)踐知識(shí)之后,最后我們來(lái)說(shuō)經(jīng)驗(yàn)與思考。在你確定要做某一個(gè)方向之后,對(duì)這個(gè)方向的方法要有一個(gè)全面系統(tǒng)的認(rèn)識(shí),很多方法是一脈相承的,如果只追求時(shí)髦看最新的算法,你很難做出學(xué)術(shù)上的創(chuàng)新,以及工程上的優(yōu)化。對(duì)于本問(wèn)題所有的經(jīng)典論文,都應(yīng)該化時(shí)間細(xì)度,清楚的理解它們解決了什么問(wèn)題,是怎么解決的,還有哪些問(wèn)題沒(méi)有解決。例如:
機(jī)器視覺(jué)目標(biāo)檢測(cè)中的遮擋問(wèn)題
推薦系統(tǒng)中的冷啟動(dòng)問(wèn)題
自然語(yǔ)言處理中文分詞中的歧義切分問(wèn)題
只有經(jīng)過(guò)大量的編程和實(shí)驗(yàn)訓(xùn)練,以及持續(xù)的思考,你才能算得上對(duì)這個(gè)方向深刻理解,以至于有自己的理解。很多同學(xué)對(duì)自己實(shí)現(xiàn)輪上的算法沒(méi)有底氣,解決這個(gè)問(wèn)題最快的途徑就是看論文算法的開(kāi)源代碼,在github上有豐富的資源,選擇一些合適的,研究一下別人是怎么實(shí)現(xiàn)的,你就能明白怎么實(shí)現(xiàn)自己的網(wǎng)絡(luò)結(jié)構(gòu)和損失函數(shù),照葫蘆畫瓢即可。
計(jì)算機(jī)以及人工智能是一個(gè)偏實(shí)踐的學(xué)科,它的方法和理論既需要我們有扎實(shí)的理論功底,又需要有豐富的實(shí)踐能力與經(jīng)驗(yàn)。這兩個(gè)方面構(gòu)成了算法工程師最主要的素質(zhì)。科學(xué)的學(xué)習(xí)路徑能夠讓你取得好的學(xué)習(xí)效果,同時(shí)也縮短學(xué)習(xí)時(shí)間。錯(cuò)誤和浮躁的做法則會(huì)讓你最后事倍功半。這是SIGAI對(duì)想進(jìn)入這個(gè)領(lǐng)域,或者剛進(jìn)入這個(gè)領(lǐng)域的每個(gè)人要說(shuō)的!
-
人工智能
+關(guān)注
關(guān)注
1804文章
48436瀏覽量
244753 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4364瀏覽量
63814 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8479瀏覽量
133819
原文標(biāo)題:怎樣成為一名優(yōu)秀的算法工程師
文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論