作者:張相於 | 算法算卦
來(lái)源:
https://mp.weixin.qq.com/s/bilne1Fh90hSaKTVJk0ljQ
成為一名合格的開(kāi)發(fā)工程師不是一件簡(jiǎn)單的事情食寡,需要掌握從開(kāi)發(fā)到調(diào)試到優(yōu)化等一系列能力雾狈,這些能力中的每一項(xiàng)掌握起來(lái)都需要足夠的努力和經(jīng)驗(yàn)。
而要成為一名合格的機(jī)器學(xué)習(xí)算法工程師(以下簡(jiǎn)稱(chēng)算法工程師)更是難上加難抵皱,因?yàn)樵谡莆展こ處煹耐ㄓ眉寄芤酝馍崎唬€需要掌握一張不算小的機(jī)器學(xué)習(xí)算法知識(shí)網(wǎng)絡(luò)辩蛋。
下面我們就將成為一名合格的算法工程師所需的技能進(jìn)行拆分,一起來(lái)看一下究竟需要掌握哪些技能才能算是一名合格的算法工程師移盆。
圖1 機(jī)器學(xué)習(xí)算法工程師技能樹(shù)
基礎(chǔ)開(kāi)發(fā)能力
所謂算法工程師悼院,首先需要是一名工程師,那么就要掌握所有開(kāi)發(fā)工程師都需要掌握的一些能力咒循。有些同學(xué)對(duì)于這一點(diǎn)存在一些誤解据途,認(rèn)為所謂算法工程師就只需要思考和設(shè)計(jì)算法,不用在乎這些算法如何實(shí)現(xiàn)叙甸,而且會(huì)有人幫你來(lái)實(shí)現(xiàn)你想出來(lái)的算法方案颖医。這種思想是錯(cuò)誤的,在大多數(shù)企業(yè)的大多數(shù)職位中裆蒸,算法工程師需要負(fù)責(zé)從算法設(shè)計(jì)到算法實(shí)現(xiàn)再到算法上線(xiàn)這一個(gè)全流程的工作熔萧。
筆者曾經(jīng)見(jiàn)過(guò)一些企業(yè)實(shí)行過(guò)算法設(shè)計(jì)與算法實(shí)現(xiàn)相分離的組織架構(gòu),但是在這種架構(gòu)下僚祷,說(shuō)不清楚誰(shuí)該為算法效果負(fù)責(zé)佛致,算法設(shè)計(jì)者和算法開(kāi)發(fā)者都有一肚子的苦水,具體原因不在本文的討論范疇中久妆,但希望大家記住的是晌杰,基礎(chǔ)的開(kāi)發(fā)技能是所有算法工程師都需要掌握的。
基礎(chǔ)開(kāi)發(fā)所涉及到的技能非常的多筷弦,在這里只挑選了兩個(gè)比較重要的點(diǎn)來(lái)做闡述肋演。
單元測(cè)試
在企業(yè)應(yīng)用中,一個(gè)問(wèn)題的完整解決方案通常包括很多的流程烂琴,這其中每個(gè)環(huán)節(jié)都需要反復(fù)迭代優(yōu)化調(diào)試爹殊,如何能夠?qū)?fù)雜任務(wù)進(jìn)行模塊劃分,并且保證整體流程的正確性呢奸绷?最實(shí)用的方法就是單元測(cè)試梗夸。單元測(cè)試并不只是簡(jiǎn)單的一種測(cè)試技能,它首先是一種設(shè)計(jì)能力号醉。并不是每份代碼都可以做單元測(cè)試反症,能做單元測(cè)試的前提是代碼首先是可以劃分為多個(gè)單元——也就是模塊的。在把項(xiàng)目拆解成可獨(dú)立開(kāi)發(fā)和測(cè)試的模塊之后畔派,再加上對(duì)每個(gè)模塊的獨(dú)立的铅碍、可重復(fù)的單元測(cè)試,就可以保證每個(gè)模塊的正確性线椰,如果每個(gè)模塊的正確性都可以保證胞谈,那么整體流程的正確性就可以得到保證。
對(duì)于算法開(kāi)發(fā)這種流程變動(dòng)頻繁的開(kāi)發(fā)活動(dòng)來(lái)講,做好模塊設(shè)計(jì)和單元測(cè)試是不給自己和他人挖坑的重要保證烦绳。也是能讓自己放心地對(duì)代碼做各種改動(dòng)優(yōu)化的重要前提卿捎。
邏輯抽象復(fù)用
邏輯的抽象復(fù)用可以說(shuō)是所有軟件開(kāi)發(fā)活動(dòng)中最為重要的一條原則,衡量一個(gè)程序員代碼水平的重要原則之一就是看他代碼中重復(fù)代碼和相似代碼的比例径密。大量重復(fù)代碼或相似代碼背后反映的是工程師思維的懶惰午阵,因?yàn)樗X(jué)得復(fù)制粘貼或者直接照著抄是最省事的做法。這樣做不僅看上去非常的丑陋享扔,而且也非常容易出錯(cuò)趟庄,更不用提維護(hù)起來(lái)的難度。
算法開(kāi)發(fā)的項(xiàng)目中經(jīng)常會(huì)有很多類(lèi)似邏輯的出現(xiàn)伪很,例如對(duì)多個(gè)特征使用類(lèi)似的處理方法戚啥,還有原始數(shù)據(jù)ETL中的很多類(lèi)似處理方法。如果不對(duì)重復(fù)邏輯做好抽象锉试,代碼看上去全是一行行的重復(fù)代碼猫十,無(wú)論是閱讀起來(lái)還是維護(hù)起來(lái)都會(huì)非常麻煩。
概率和統(tǒng)計(jì)基礎(chǔ)
概率和統(tǒng)計(jì)可以說(shuō)是機(jī)器學(xué)習(xí)領(lǐng)域的基石之一呆盖,從某個(gè)角度來(lái)看拖云,機(jī)器學(xué)習(xí)可以看做是建立在概率思維之上的一種對(duì)不確定世界的系統(tǒng)性思考和認(rèn)知方式。學(xué)會(huì)用概率的視角看待問(wèn)題应又,用概率的語(yǔ)言描述問(wèn)題宙项,是深入理解和熟練運(yùn)用機(jī)器學(xué)習(xí)技術(shù)的最重要基礎(chǔ)之一。
概率論內(nèi)容很多株扛,但都是以具體的一個(gè)個(gè)分布為具體表現(xiàn)載體體現(xiàn)出來(lái)的尤筐,所以學(xué)好常用的概率分布及其各種性質(zhì)對(duì)于學(xué)好概率非常重要。對(duì)于離散數(shù)據(jù)洞就,伯努利分布盆繁、二項(xiàng)分布、多項(xiàng)分布旬蟋、Beta分布油昂、狄里克萊分布以及泊松分布都是需要理解掌握的內(nèi)容;對(duì)于離線(xiàn)數(shù)據(jù)倾贰,高斯分布和指數(shù)分布族是比較重要的分布冕碟。這些分布貫穿著機(jī)器學(xué)習(xí)的各種模型之中,也存在于互聯(lián)網(wǎng)和真實(shí)世界的各種數(shù)據(jù)之中匆浙,理解了數(shù)據(jù)的分布安寺,才能知道該對(duì)它們做什么樣的處理。
此外吞彤,假設(shè)檢驗(yàn)的相關(guān)理論也需要掌握我衬。在這個(gè)所謂的大數(shù)據(jù)時(shí)代,最能騙人的大概就是數(shù)據(jù)了饰恕,掌握了假設(shè)檢驗(yàn)和置信區(qū)間等相關(guān)理論挠羔,才能具備分辨數(shù)據(jù)結(jié)論真?zhèn)蔚哪芰Α@鐑山M數(shù)據(jù)是否真的存在差異埋嵌,上線(xiàn)一個(gè)策略之后指標(biāo)是否真的有提升等等破加。這種問(wèn)題在實(shí)際工作中非常常見(jiàn),不掌握相關(guān)能力的話(huà)相當(dāng)于就是大數(shù)據(jù)時(shí)代的睜眼瞎雹嗦。
在統(tǒng)計(jì)方面范舀,一些常用的參數(shù)估計(jì)方法也需要掌握,典型的如最大似然估計(jì)了罪、最大后驗(yàn)估計(jì)锭环、EM算法等。這些理論和最優(yōu)化理論一樣泊藕,都是可以應(yīng)用于所有模型的理論辅辩,是基礎(chǔ)中的基礎(chǔ)。
機(jī)器學(xué)習(xí)理論
雖然現(xiàn)在開(kāi)箱即用的開(kāi)源工具包越來(lái)越多娃圆,但并不意味著算法工程師就可以忽略機(jī)器學(xué)習(xí)基礎(chǔ)理論的學(xué)習(xí)和掌握玫锋。這樣做主要有兩方面的意義:
掌握理論才能對(duì)各種工具、技巧靈活應(yīng)用讼呢,而不是只會(huì)照搬套用撩鹿。只有在這個(gè)基礎(chǔ)上才能夠真正具備搭建一套機(jī)器學(xué)習(xí)系統(tǒng)的能力,并對(duì)其進(jìn)行持續(xù)優(yōu)化悦屏。否則只能算是機(jī)器學(xué)習(xí)搬磚工人节沦,算不得合格的工程師。出了問(wèn)題也不會(huì)解決础爬,更談不上對(duì)系統(tǒng)做優(yōu)化散劫。
學(xué)習(xí)機(jī)器學(xué)習(xí)的基礎(chǔ)理論的目的不僅僅是學(xué)會(huì)如何構(gòu)建機(jī)器學(xué)習(xí)系統(tǒng),更重要的是幕帆,這些基礎(chǔ)理論里面體現(xiàn)的是一套思想和思維模式获搏,其內(nèi)涵包括概率性思維、矩陣化思維失乾、最優(yōu)化思維等多個(gè)子領(lǐng)域常熙,這一套思維模式對(duì)于在當(dāng)今這個(gè)大數(shù)據(jù)時(shí)代做數(shù)據(jù)的處理、分析和建模是非常有幫助的碱茁。如果你腦子里沒(méi)有這套思維裸卫,面對(duì)大數(shù)據(jù)環(huán)境還在用老一套非概率的、標(biāo)量式的思維去思考問(wèn)題纽竣,那么思考的效率和深度都會(huì)非常受限墓贿。
機(jī)器學(xué)習(xí)的理論內(nèi)涵和外延非常之廣茧泪,絕非一篇文章可以窮盡,所以在這里我列舉了一些比較核心聋袋,同時(shí)對(duì)于實(shí)際工作比較有幫助的內(nèi)容進(jìn)行介紹队伟,大家可在掌握了這些基礎(chǔ)內(nèi)容之后,再不斷探索學(xué)習(xí)幽勒。
基礎(chǔ)理論
所謂基礎(chǔ)理論嗜侮,指的是不涉及任何具體模型,而只關(guān)注“學(xué)習(xí)”這件事本身的一些理論啥容。以下是一些比較有用的基礎(chǔ)概念:
VC維锈颗。VC維是一個(gè)很有趣的概念,它的主體是一類(lèi)函數(shù)咪惠,描述的是這類(lèi)函數(shù)能夠把多少個(gè)樣本的所有組合都劃分開(kāi)來(lái)击吱。VC維的意義在哪里呢?它在于當(dāng)你選定了一個(gè)模型以及它對(duì)應(yīng)的特征之后遥昧,你是大概可以知道這組模型和特征的選擇能夠?qū)Χ啻蟮臄?shù)據(jù)集進(jìn)行分類(lèi)的姨拥。此外,一類(lèi)函數(shù)的VC維的大小渠鸽,還可以反應(yīng)出這類(lèi)函數(shù)過(guò)擬合的可能性叫乌。
信息論。從某種角度來(lái)講徽缚,機(jī)器學(xué)習(xí)和信息論是同一個(gè)問(wèn)題的兩個(gè)側(cè)面憨奸,機(jī)器學(xué)習(xí)模型的優(yōu)化過(guò)程同時(shí)也可以看作是最小化數(shù)據(jù)集中信息量的過(guò)程。對(duì)信息論中基本概念的了解凿试,對(duì)于機(jī)器學(xué)習(xí)理論的學(xué)習(xí)是大有裨益的排宰。例如決策樹(shù)中用來(lái)做分裂決策依據(jù)的信息增益,衡量數(shù)據(jù)信息量的信息熵等等那婉,這些概念的理解對(duì)于機(jī)器學(xué)習(xí)問(wèn)題神本的理解都很有幫助板甘。這部分內(nèi)容可參考《Elements of Information Theory》這本書(shū)。
正則化和bias-variance tradeoff详炬。如果說(shuō)現(xiàn)階段我國(guó)的主要矛盾是“人民日益增長(zhǎng)的美好生活需要和不平衡不充分的發(fā)展之間的矛盾”盐类,那么機(jī)器學(xué)習(xí)中的主要矛盾就是模型要盡量擬合數(shù)據(jù)和模型不能過(guò)度擬合數(shù)據(jù)之間的矛盾。而化解這一矛盾的核心技術(shù)之一就是正則化呛谜。正則化的具體方法不在此討論在跳,但需要理解的,是各種正則化方法背后透露出的思想:bias-variance tradoff隐岛。在不同利益點(diǎn)之間的平衡與取舍是各種算法之間的重要差異猫妙,理解這一點(diǎn)對(duì)于理解不同算法之間的核心差異有著非常重要的作用。
最優(yōu)化理論聚凹。絕大多數(shù)機(jī)器學(xué)習(xí)問(wèn)題的解決割坠,都可以劃分為兩個(gè)階段:建模和優(yōu)化齐帚。所謂建模就是后面我們會(huì)提到的各種用模型來(lái)描述問(wèn)題的方法,而優(yōu)化就是建模完成之后求得模型的最優(yōu)參數(shù)的過(guò)程彼哼。機(jī)器學(xué)習(xí)中常用的模型有很多对妄,但背后用到的優(yōu)化方法卻并沒(méi)有那么多。換句話(huà)說(shuō)沪羔,很多模型都是用的同一套優(yōu)化方法,而同一個(gè)優(yōu)化方法也可以用來(lái)優(yōu)化很多不同模型象浑。對(duì)各種常用優(yōu)化方法的和思想有所有了解非常有必要蔫饰,對(duì)于理解模型訓(xùn)練的過(guò)程,以及解釋各種情況下模型訓(xùn)練的效果都很有幫助愉豺。這里面包括最大似然篓吁、最大后驗(yàn)、梯度下降蚪拦、擬牛頓法杖剪、L-BFGS等。
機(jī)器學(xué)習(xí)的基礎(chǔ)理論還有很多驰贷,可以先從上面的概念學(xué)起盛嘿,把它們當(dāng)做學(xué)習(xí)的起點(diǎn),在學(xué)習(xí)過(guò)程中還會(huì)遇到其他需要學(xué)習(xí)的內(nèi)容括袒,就像一張網(wǎng)絡(luò)慢慢鋪開(kāi)一樣次兆,不斷積累自己的知識(shí)。這方面基礎(chǔ)理論的學(xué)習(xí)锹锰,除了Andrew Ng的著名課程以外芥炭,《Learning from Data》這門(mén)公開(kāi)課也非常值得大家學(xué)習(xí),這門(mén)課沒(méi)有任何背景要求恃慧,講授的內(nèi)容是在所有模型之下的基礎(chǔ)中的基礎(chǔ)园蝠,非常地靠近機(jī)器學(xué)習(xí)的內(nèi)核本質(zhì)。這門(mén)課的中文版本叫做《機(jī)器學(xué)習(xí)基石》痢士,也可以在網(wǎng)上找到彪薛,其講授者是上面英文版本講授者的學(xué)生。
有監(jiān)督學(xué)習(xí)
在了解了機(jī)器學(xué)習(xí)的基本概念之后怠蹂,就可以進(jìn)入到一些具體模型的學(xué)習(xí)中了陪汽。在目前的工業(yè)實(shí)踐中,有監(jiān)督學(xué)習(xí)的應(yīng)用面仍然是最廣泛的褥蚯,這是因?yàn)槲覀儸F(xiàn)實(shí)中遇到的很多問(wèn)題都是希望對(duì)某個(gè)事物的某個(gè)屬性做出預(yù)測(cè)挚冤,而這些問(wèn)題通過(guò)合理的抽象和變換,都可以轉(zhuǎn)化為有監(jiān)督學(xué)習(xí)的問(wèn)題赞庶。
在學(xué)習(xí)復(fù)雜模型之前训挡,我建議大家都先學(xué)習(xí)幾個(gè)最簡(jiǎn)單的模型澳骤,典型的如樸素貝葉斯。樸素貝葉斯有很強(qiáng)的假設(shè)澜薄,這個(gè)假設(shè)很多問(wèn)題都不滿(mǎn)足为肮,模型結(jié)構(gòu)也很簡(jiǎn)單,所以其優(yōu)化效果并不是最好的肤京。但也正是由于其簡(jiǎn)單的形式颊艳,非常利于學(xué)習(xí)者深入理解整個(gè)模型在建模和優(yōu)化過(guò)程中的每一步,這對(duì)于搞清楚機(jī)器學(xué)習(xí)是怎么一回事情是非常有用的忘分。同時(shí)棋枕,樸素貝葉斯的模型形式通過(guò)一番巧妙的變換之后,可以得到和邏輯回歸形式上非常統(tǒng)一的結(jié)果妒峦,這無(wú)疑提供了對(duì)邏輯回歸另外一個(gè)角度的解釋?zhuān)瑢?duì)于更加深刻理解邏輯回歸這一最常用模型有著非常重要的作用重斑。
在掌握了機(jī)器學(xué)習(xí)模型的基礎(chǔ)流程之后逆日,需要學(xué)習(xí)兩種最基礎(chǔ)的模型形式:線(xiàn)性模型和樹(shù)形模型膜毁,分別對(duì)應(yīng)著線(xiàn)性回歸/邏輯回歸和決策回歸/分類(lèi)樹(shù)。現(xiàn)在常用的模型愿险,無(wú)論是淺層模型還是深度學(xué)習(xí)的深層模型笛丙,都是基于這兩種基礎(chǔ)模型形式變幻而來(lái)漾脂。而學(xué)習(xí)這兩種模型的時(shí)候需要仔細(xì)思考的問(wèn)題是:這兩種模型的本質(zhì)差異是什么?為什么需要有這兩種模型胚鸯?他們?cè)谟?xùn)練和預(yù)測(cè)的精度符相、效率、復(fù)雜度等方面有什么差異蠢琳?了解清楚這些本質(zhì)的差異之后啊终,才可以做到根據(jù)問(wèn)題和數(shù)據(jù)的具體情況對(duì)模型自如運(yùn)用。
在掌握了線(xiàn)性模型和樹(shù)形模型這兩種基礎(chǔ)形式之后傲须,下一步需要掌握的是這兩種基礎(chǔ)模型的復(fù)雜形式蓝牲。其中線(xiàn)性模型的復(fù)雜形式就是多層線(xiàn)性模型,也就是神經(jīng)網(wǎng)絡(luò)泰讽。樹(shù)模型的復(fù)雜形式包括以GDBT為代表的boosting組合例衍,以及以隨機(jī)森林為代表的bagging組合。這兩種組合模型的意義不僅在于模型本身已卸,boosting和bagging這兩種組合思想本身也非常值得學(xué)習(xí)和理解佛玄,這代表了兩種一般性的強(qiáng)化方法:boosting的思想是精益求精,不斷在之前的基礎(chǔ)上繼續(xù)優(yōu)化累澡;而bagging的思想是“三個(gè)臭裨將頂一個(gè)諸葛亮”梦抢,是通過(guò)多個(gè)弱分類(lèi)器的組合來(lái)得到一個(gè)強(qiáng)分類(lèi)器。這兩種組合方法各有優(yōu)劣愧哟,但都是在日常工作中可以借鑒的思想奥吩。例如在推薦系統(tǒng)中所我們經(jīng)常會(huì)使用多個(gè)維度的數(shù)據(jù)做召回源哼蛆,從某個(gè)角度來(lái)看就是一種bagging的思想:每個(gè)單獨(dú)召回源并不能給出最好表現(xiàn),但是多個(gè)召回源組合之后霞赫,就可以得到比每個(gè)單獨(dú)召回源都要好的結(jié)果腮介。所以說(shuō)思想比模型本身更重要。
無(wú)監(jiān)督學(xué)習(xí)
有監(jiān)督學(xué)習(xí)雖然目前占了機(jī)器學(xué)習(xí)應(yīng)用的大多數(shù)場(chǎng)景端衰,但是無(wú)監(jiān)督學(xué)習(xí)無(wú)論從數(shù)據(jù)規(guī)模還是作用上來(lái)講也都非常的重要叠洗。無(wú)監(jiān)督學(xué)習(xí)的一大類(lèi)內(nèi)容是在做聚類(lèi),做聚類(lèi)的意義通陈枚可以分為兩類(lèi):一類(lèi)是將聚類(lèi)結(jié)果本身當(dāng)做最終的目標(biāo)灭抑,另一類(lèi)是將聚類(lèi)的結(jié)果再作為特征用到有監(jiān)督學(xué)習(xí)中。但這兩種意義并不是和某種聚類(lèi)方法具體綁定玉锌,而只是聚類(lèi)之后結(jié)果的不同使用方式名挥,這需要在工作中不斷學(xué)習(xí)疟羹、積累和思考主守。而在入門(mén)學(xué)習(xí)階段需要掌握的,是不同聚類(lèi)算法的核心差異在哪里榄融。例如最常用的聚類(lèi)方法中参淫,kmeans和DBSCAN分別適合處理什么樣的問(wèn)題?高斯混合模型有著什么樣的假設(shè)愧杯?LDA中文檔涎才、主題和詞之間是什么關(guān)系?這些模型最好能夠放到一起來(lái)學(xué)習(xí)力九,從而掌握它們之間的聯(lián)系和差異耍铜,而不是把他們當(dāng)做一個(gè)個(gè)孤立的東西來(lái)看待。
除了聚類(lèi)以外跌前,近年來(lái)興起的嵌入表示(embedding representation)也是無(wú)監(jiān)督學(xué)習(xí)的一種重要方法棕兼。這種方法和聚類(lèi)的差異在于,聚類(lèi)的方法是使用已有特征對(duì)數(shù)據(jù)進(jìn)行劃分抵乓,而嵌入表示則是創(chuàng)造新的特征伴挚,這種新的特征是對(duì)樣本的一種全新的表示方式。這種新的表示方法提供了對(duì)數(shù)據(jù)全新的觀察視角灾炭,這種視角提供了數(shù)據(jù)處理的全新的可能性茎芋。此外,這種做法雖然是從NLP領(lǐng)域中興起蜈出,但卻具有很強(qiáng)的普適性田弥,可用來(lái)處理多種多樣的數(shù)據(jù),都可以得到不錯(cuò)的結(jié)果铡原,所以現(xiàn)在已經(jīng)成為一種必備的技能皱蹦。
機(jī)器學(xué)習(xí)理論方面的學(xué)習(xí)可以從《An Introduction to Statistical Learning with Application in R》開(kāi)始煤杀,這本書(shū)對(duì)一些常用模型和理論基礎(chǔ)提供了很好的講解,同時(shí)也有適量的習(xí)題用來(lái)鞏固所學(xué)知識(shí)沪哺。進(jìn)階學(xué)習(xí)可使用上面這本書(shū)的升級(jí)版《Elements of Statistical Learning》和著名的《Pattern Recognition and Machine Learning》沈自。
開(kāi)發(fā)語(yǔ)言和開(kāi)發(fā)工具
掌握了足夠的理論知識(shí),還需要足夠的工具來(lái)將這些理論落地辜妓,這部分我們介紹一些常用的語(yǔ)言和工具枯途。
開(kāi)發(fā)語(yǔ)言
近年來(lái)Python可以說(shuō)是數(shù)據(jù)科學(xué)和算法領(lǐng)域最火的語(yǔ)言,主要原因是它使用門(mén)檻低籍滴,上手容易酪夷,同時(shí)具有著完備的工具生態(tài)圈,同時(shí)各種平臺(tái)對(duì)其支持也比較好孽惰。所以Python方面我就不再贅述晚岭。但是在學(xué)習(xí)Python以外,我建議大家可以再學(xué)習(xí)一下R語(yǔ)言勋功,主要原因有以下幾點(diǎn):
R語(yǔ)言具有最完備的統(tǒng)計(jì)學(xué)工具鏈坦报。我們?cè)谏厦娼榻B了概率和統(tǒng)計(jì)的重要性,R語(yǔ)言在這方面提供的支持是最全面的狂鞋,日常的一些統(tǒng)計(jì)方面的需求片择,用R來(lái)做可能要比用Python來(lái)做還要更快。Python的統(tǒng)計(jì)科學(xué)工具雖然也在不斷完善骚揍,但是R仍然是統(tǒng)計(jì)科學(xué)最大最活躍的社區(qū)字管。
向量化、矩陣化和表格化思維的培養(yǎng)信不。R中的所有數(shù)據(jù)類(lèi)型都是向量化的嘲叔,一個(gè)整形的變量本質(zhì)上是一個(gè)長(zhǎng)度為一的一維向量。在此基礎(chǔ)上R語(yǔ)言構(gòu)建了高效的矩陣和(DataFrame)數(shù)據(jù)類(lèi)型抽活,并且在上面支持了非常復(fù)雜而又直觀的操作方法硫戈。這套數(shù)據(jù)類(lèi)型和思考方式也在被很多更現(xiàn)代化的語(yǔ)言和工具所采納,例如Numpy中的ndarray酌壕,以及Spark最新版本中引入的DataFrame掏愁,可以說(shuō)都是直接或間接從R語(yǔ)言得到的靈感,定義在上面的數(shù)據(jù)操作也和R中對(duì)DataFrame和向量的操作如出一轍卵牍。就像學(xué)編程都要從C語(yǔ)言學(xué)起一樣果港,學(xué)數(shù)據(jù)科學(xué)和算法開(kāi)發(fā)我建議大家都學(xué)一下R,學(xué)的既是它的語(yǔ)言本身糊昙,更是它的內(nèi)涵思想辛掠,對(duì)大家掌握和理解現(xiàn)代化工具都大有裨益。
除了R以外,Scala也是一門(mén)值得學(xué)習(xí)的語(yǔ)言萝衩。原因在于它是目前將面向?qū)ο蠛秃瘮?shù)式兩種編程范式結(jié)合得比較好的一種語(yǔ)言回挽,因?yàn)樗粡?qiáng)求你一定要用函數(shù)式去寫(xiě)代碼,同時(shí)還能夠在能夠利用函數(shù)式的地方給予了足夠的支持猩谊。這使得它的使用門(mén)檻并不高千劈,但是隨著經(jīng)驗(yàn)和知識(shí)的不斷積累,你可以用它寫(xiě)出越來(lái)越高級(jí)牌捷、優(yōu)雅的代碼墙牌。
開(kāi)發(fā)工具
開(kāi)發(fā)工具方面,Python系的工具無(wú)疑是實(shí)用性最高的暗甥,具體來(lái)說(shuō)喜滨,Numpy、Scipy撤防、sklearn虽风、pandas、Matplotlib組成的套件可以滿(mǎn)足單機(jī)上絕大多數(shù)的分析和訓(xùn)練工作寄月。但是在模型訓(xùn)練方面辜膝,有一些更加專(zhuān)注的工具可以給出更好的訓(xùn)練精度和性能,典型的如LibSVM剥懒、Liblinear内舟、XGBoost等合敦。
大數(shù)據(jù)工具方面初橘,目前離線(xiàn)計(jì)算的主流工具仍然是Hadoop和Spark,實(shí)時(shí)計(jì)算方面Spark Streaming和Storm也是比較主流的選擇充岛。近年來(lái)興起的新平臺(tái)也比較多保檐,例如Flink和Tensorflow都是值得關(guān)注的。值得一提的是崔梗,對(duì)于Hadoop和Spark的掌握夜只,不僅要掌握其編碼技術(shù),同時(shí)還要對(duì)其運(yùn)行原理有一定理解蒜魄,例如扔亥,Map-Reduce的流程在Hadoop上是如何實(shí)現(xiàn)的,Spark上什么操作比較耗時(shí)谈为,aggregateByKey和groupByKey在運(yùn)行原理上有什么差異旅挤,等等。只有掌握了這些伞鲫,才能對(duì)這些大數(shù)據(jù)平臺(tái)運(yùn)用自如粘茄,否則很容易出現(xiàn)程序耗時(shí)過(guò)長(zhǎng)、跑不動(dòng)、內(nèi)存爆掉等等問(wèn)題柒瓣。
架構(gòu)設(shè)計(jì)
最后我們花一些篇幅來(lái)談一下機(jī)器學(xué)習(xí)系統(tǒng)的架構(gòu)設(shè)計(jì)儒搭。所謂機(jī)器學(xué)習(xí)系統(tǒng)的架構(gòu),指的是一套能夠支持機(jī)器學(xué)習(xí)訓(xùn)練芙贫、預(yù)測(cè)搂鲫、服務(wù)穩(wěn)定高效運(yùn)行的整體系統(tǒng)以及他們之間的關(guān)系。
在業(yè)務(wù)規(guī)模和復(fù)雜度發(fā)展到一定程度的時(shí)候磺平,機(jī)器學(xué)習(xí)一定會(huì)走向系統(tǒng)化默穴、平臺(tái)化這個(gè)方向。這個(gè)時(shí)候就需要根據(jù)業(yè)務(wù)特點(diǎn)以及機(jī)器學(xué)習(xí)本身的特點(diǎn)來(lái)設(shè)計(jì)一套整體架構(gòu)褪秀,這里面包括上游數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)流的架構(gòu)設(shè)計(jì)蓄诽,以及模型訓(xùn)練的架構(gòu),還有線(xiàn)上服務(wù)的架構(gòu)等等媒吗。這一套架構(gòu)的學(xué)習(xí)就不像前面的內(nèi)容那么簡(jiǎn)單了仑氛,沒(méi)有太多現(xiàn)成教材可以學(xué)習(xí),更多的是在大量實(shí)踐的基礎(chǔ)上進(jìn)行抽象總結(jié)闸英,對(duì)當(dāng)前系統(tǒng)不斷進(jìn)行演化和改進(jìn)锯岖。但這無(wú)疑是算法工程師職業(yè)道路上最值得為之奮斗的工作。在這里能給的建議就是多實(shí)踐甫何,多總結(jié)出吹,多抽象,多迭代辙喂。
機(jī)器學(xué)習(xí)算法工程師領(lǐng)域現(xiàn)狀
現(xiàn)在可以說(shuō)是機(jī)器學(xué)習(xí)算法工程師最好的時(shí)代捶牢,各行各業(yè)對(duì)這類(lèi)人才的需求都非常旺盛。典型的包括以下一些細(xì)分行業(yè):
推薦系統(tǒng)巍耗。推薦系統(tǒng)解決的是海量數(shù)據(jù)場(chǎng)景下信息高效匹配分發(fā)的問(wèn)題秋麸,在這個(gè)過(guò)程中,無(wú)論是候選集召回炬太,還是結(jié)果排序灸蟆,以及用戶(hù)畫(huà)像等等方面,機(jī)器學(xué)習(xí)都起著重要的作用亲族。
廣告系統(tǒng)炒考。廣告系統(tǒng)和推薦系統(tǒng)有很多類(lèi)似的地方,但也有著很顯著的差異霎迫,需要在考慮平臺(tái)和用戶(hù)之外同時(shí)考慮廣告主的利益斋枢,兩方變成了三方,使得一些問(wèn)題變復(fù)雜了很多女气。它在對(duì)機(jī)器學(xué)習(xí)的利用方面也和推薦類(lèi)似杏慰。
搜索系統(tǒng)。搜索系統(tǒng)的很多基礎(chǔ)建設(shè)和上層排序方面都大量使用了機(jī)器學(xué)習(xí)技術(shù),而且在很多網(wǎng)站和App中缘滥,搜索都是非常重要的流量入口轰胁,機(jī)器學(xué)習(xí)對(duì)搜索系統(tǒng)的優(yōu)化會(huì)直接影響到整個(gè)網(wǎng)站的效率。
風(fēng)控系統(tǒng)朝扼。風(fēng)控赃阀,尤其是互聯(lián)網(wǎng)金融風(fēng)控是近年來(lái)興起的機(jī)器學(xué)習(xí)的又一重要戰(zhàn)場(chǎng)。不夸張地說(shuō)擎颖,運(yùn)用機(jī)器學(xué)習(xí)的能力可以很大程度上決定一家互聯(lián)網(wǎng)金融企業(yè)的風(fēng)控能力榛斯,而風(fēng)控能力本身又是這些企業(yè)業(yè)務(wù)保障的核心競(jìng)爭(zhēng)力,這其中的關(guān)系大家可以感受一下搂捧。
但是所謂“工資越高驮俗,責(zé)任越大”,企業(yè)對(duì)于算法工程師的要求也在逐漸提高允跑。整體來(lái)說(shuō)王凑,一名高級(jí)別的算法工程師應(yīng)該能夠處理“數(shù)據(jù)獲取→數(shù)據(jù)分析→模型訓(xùn)練調(diào)優(yōu)→模型上線(xiàn)”這一完整流程,并對(duì)流程中的各種環(huán)節(jié)做不斷優(yōu)化聋丝。一名工程師入門(mén)時(shí)可能會(huì)從上面流程中的某一個(gè)環(huán)節(jié)做起索烹,不斷擴(kuò)大自己的能力范圍。
除了上面列出的領(lǐng)域以外弱睦,還有很多傳統(tǒng)行業(yè)也在不斷挖掘機(jī)器學(xué)習(xí)解決傳統(tǒng)問(wèn)題的能力百姓,行業(yè)的未來(lái)可謂潛力巨大。
作者:7125messi
鏈接:http://www.reibang.com/p/ad5089f96f57
來(lái)源:簡(jiǎn)書(shū)
簡(jiǎn)書(shū)著作權(quán)歸作者所有况木,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處垒拢。