對(duì)應(yīng)大多數(shù)人而言,做機(jī)器學(xué)習(xí)等各種算法,最難突破的就兩個(gè)點(diǎn),一個(gè)是計(jì)算機(jī)能力,另一個(gè)是數(shù)學(xué)能力,由于現(xiàn)在有關(guān)技術(shù)逐漸成熟,教程和課程都逐漸完善,另外這個(gè)領(lǐng)域多半是計(jì)算機(jī)專業(yè)出身的同學(xué),因此計(jì)算機(jī)能力慢慢變成了基操,大家都覺得還合適,但是數(shù)學(xué),從本科各位同學(xué)學(xué)高數(shù)就開始嗷嗷叫了,然而要吃算法這碗飯,不得不邁過這座山,所以,還是得生啃。
而我,是從比高數(shù)更難的數(shù)分,比現(xiàn)代更難的高代過來,走過實(shí)變復(fù)變出來的一個(gè)普通的數(shù)學(xué)系同學(xué),跌跌撞撞的走來感覺有些經(jīng)驗(yàn)可以和大家分享,結(jié)合著我昨天收集的信息,給大家談?wù)勗谶@個(gè)領(lǐng)域,數(shù)學(xué)的作用以及一些學(xué)習(xí)方法吧,如有補(bǔ)充可以看看評(píng)論。
懶人目錄
- 擅長數(shù)學(xué)的好處
- 算法領(lǐng)域?qū)?shù)學(xué)的要求
- 需要掌握哪些知識(shí)
- 學(xué)習(xí)方法
- 部分資料推薦
- 有關(guān)數(shù)據(jù)結(jié)構(gòu)與算法
- 部分問題專題
擅長數(shù)學(xué)的好處
在知乎里很多人把數(shù)學(xué)系的人干其他事情稱為“猛虎下山”,因?yàn)榱私饬嘶镜姆椒ㄕ摵髮?duì)于具體問題會(huì)有著獨(dú)特的角度和更為嚴(yán)謹(jǐn)?shù)乃季S方法。那么在算法領(lǐng)域,擅長數(shù)學(xué)會(huì)有什么好處,我來簡單討論一下。
首先,擅長數(shù)學(xué)的人,會(huì)對(duì)模型有更加深入的理解。雖然現(xiàn)在在技術(shù)上,tf、sklearn之類的已經(jīng)能夠支持基本算法的操作,但是,對(duì)于不理解模型的人,那終究是積木,只能通過搭積木+實(shí)驗(yàn)的方法,上限明顯,理解了理論,你能針對(duì)問題給處更為細(xì)節(jié)的方案,更加敢于大刀闊斧的進(jìn)行修改,大幅提升性能。
第二,數(shù)據(jù)敏感性與分析診斷能力。這個(gè)是來源于常年看著數(shù)據(jù)和進(jìn)行計(jì)算后得到的經(jīng)驗(yàn),不少職場老司機(jī)同樣也有,在進(jìn)行分析的時(shí)候經(jīng)常能發(fā)現(xiàn)邊緣但是關(guān)鍵的問題,并在實(shí)施前就想好策略解決,另一方面對(duì)于出現(xiàn)的問題,能迅速通過計(jì)算和分析得到結(jié)果,之前的文章“評(píng)價(jià)指標(biāo)設(shè)計(jì)”里面的自己設(shè)置評(píng)價(jià)指標(biāo),其實(shí)就依賴這種能力。雖說這種能力前輩都能有,但是一進(jìn)職場就有,這個(gè)就和你的數(shù)學(xué)能力有關(guān)了。
第三,更加精準(zhǔn)的理解和表達(dá)。對(duì)于模型你能寫出足夠精細(xì)的偽代碼,或者是能用公式表達(dá),那你對(duì)這個(gè)模型的理解才真正的到家,可以參考現(xiàn)在科研的論文,公式已經(jīng)是交流的基操了。
第三,就是筆面試了,筆面試常常會(huì)問你一些有關(guān)模型推導(dǎo)方面的問題,這就一定會(huì)涉及數(shù)學(xué)了,手寫支持向量機(jī),推導(dǎo)BP的反向傳播,這都是最基本的,然后是一些方向?qū)>?,推薦系統(tǒng)里面的FM,NLP中的W2V等等,最最功利的,我們要理解這些模型并在面試中說個(gè)所以然來,那就肯定要懂?dāng)?shù)學(xué)。
算法領(lǐng)域?qū)?shù)學(xué)的要求
那么問題來了,算法領(lǐng)域需要數(shù)學(xué)到什么程度呢,個(gè)人的理解,你越做的深入,需要的就越多,到后面很可能就成為你突破的瓶頸,再者,很多人把數(shù)學(xué)基礎(chǔ)理解為簡單的計(jì)算方法上,矩陣、求導(dǎo)等,而實(shí)際上遠(yuǎn)遠(yuǎn)不止如此,那在算法領(lǐng)域,具體是什么要求。
入門階段,這個(gè)階段大部分人在過類似《統(tǒng)計(jì)學(xué)習(xí)方法》之類的基礎(chǔ),而這本書事實(shí)上需要一定的數(shù)學(xué)基礎(chǔ),尤其是一些基本的數(shù)學(xué)概念,因此在此階段,要達(dá)到的水平應(yīng)該是大一數(shù)學(xué)的水平,知道基本的概念即可。
進(jìn)階階段,這時(shí)候會(huì)有些人發(fā)現(xiàn)即使懂這些基礎(chǔ),但是有些細(xì)節(jié)還是不懂“為什么”,例如SVM為什么要求對(duì)偶,SGD為什么能找最優(yōu)解等,這時(shí)候需要一些在原本數(shù)學(xué)概念基礎(chǔ)上的一些理論,前面兩個(gè)例如對(duì)應(yīng)的都是運(yùn)籌與優(yōu)化方向的知識(shí)細(xì)節(jié)。當(dāng)然了,這階段其實(shí)很多人就止步了,畢竟我使用SVM并不需要知道SVM是什么也能去用,但是你要是能邁過這關(guān),你會(huì)發(fā)現(xiàn)你對(duì)數(shù)據(jù)本身特點(diǎn)與聯(lián)系模型提出方案的能力會(huì)有質(zhì)的提升,你所謂的“經(jīng)驗(yàn)”可能有了更加扎實(shí)的理論保證,有的時(shí)候可能只是模糊的感覺,但是就感覺在你的三觀下某個(gè)模型的結(jié)果就是不好,那你可以避開了。
在進(jìn)一步,你能根據(jù)自己的理解去設(shè)計(jì)模型了。你能分析損失函數(shù)是否合適,你能找到交叉熵和MSE做損失的差別,你能根據(jù)預(yù)測性能指標(biāo)加bad case分析,來診斷模型的缺陷,根據(jù)模型的缺陷提出改進(jìn)建議,甚至是創(chuàng)新,在科研上,你就能做一些理論創(chuàng)新,在技術(shù)上,你能針對(duì)獨(dú)一無二的問題提出個(gè)性化方案,這就是專家了。
很多人可能會(huì)說,工業(yè)界很多時(shí)候用的都是基線,不需要多高端,有了數(shù)據(jù)就懟模型就好了,為什么需要這么高端的東西。我只想說,可能大部分內(nèi)容確實(shí)是所謂的low的東西,但是你在進(jìn)行迭代的時(shí)候,有自己的思路終究能給出更為合適的方案,LR萬能,但是萬能的代價(jià)是性能不會(huì)突出,相信大家都能理解。
有時(shí)候也沒有必要分的那么清,我用人話來表達(dá)一下吧,無論科研還是工程,都是這三個(gè)角度判斷:
- 看得懂公式
- 能把具體的模型演繹理解后轉(zhuǎn)化為代碼
- 在一定條件下你可能要下手改進(jìn),以更好地解決你的問題
- 必要的溝通交流,寫論文也好,文檔也好,需要公式支持你的解釋
你的數(shù)學(xué)水平,能在你的職業(yè)狀態(tài)下滿足上面需求,我覺得就完全足夠了,畢竟數(shù)學(xué)對(duì)絕大多數(shù)人來說就和英語一樣是工具。
需要掌握那些知識(shí)
要說數(shù)學(xué)知識(shí)本身,其實(shí)并不是很多,我結(jié)合著需要的程度和大家聊一下。
數(shù)學(xué)學(xué)科角度
首先是最基礎(chǔ)的數(shù)學(xué),這個(gè)對(duì)大部分大學(xué)理工類專業(yè)而言就是基礎(chǔ)課吧。個(gè)人建議要進(jìn)這行下面的都要掌握。
- 數(shù)學(xué)基礎(chǔ):
- 高數(shù)(數(shù)分):微積分,多元微積分(甚至?xí)婕熬仃嚽髮?dǎo)之類的內(nèi)容)
- 線代(高代):線性方程組,矩陣變換,行列式,線性空間,特征值特征向量
- 概率論:期望方差,古典概型,全概率貝葉斯,各種常見分布
然后是一些比較進(jìn)一步的內(nèi)容,可能會(huì)涉及不同的學(xué)科說法,我這里以我自己接觸的為例,大家聽名字應(yīng)該都會(huì)了解一些。不需要全部掌握,有需要或者有興趣看看無妨。
- 基礎(chǔ)進(jìn)階:
- 最優(yōu)化方法:最速下降法,牛頓法等,包括KKT條件以及有關(guān)理論,先序知識(shí)是高數(shù)和線代,尤其是求導(dǎo),實(shí)質(zhì)上求最優(yōu)值的核心就在于求導(dǎo)
- 矩陣論:花式矩陣分解,尤其是SVD等,在embedding等方面具有非常重要的地位
- 運(yùn)籌學(xué):尤其是在對(duì)偶理論一塊,有些時(shí)候最優(yōu)化問題可以通過對(duì)偶能求出更好的數(shù)值解甚至精確解,例如SVM中的SMO求解方法
- 數(shù)理統(tǒng)計(jì):重點(diǎn)在矩估計(jì)、極大似然估計(jì)等,至于假設(shè)檢驗(yàn),可能會(huì)在模型評(píng)估階段會(huì)用到,如果有必要可以了解,有時(shí)候類似單側(cè)檢驗(yàn)之類的在AB實(shí)驗(yàn)真的用過
- 多元統(tǒng)計(jì)分析:這個(gè)和機(jī)器學(xué)習(xí)有巨大重合,k-means之類的甚至都會(huì)談,包括PCA等
- 數(shù)值分析:從計(jì)算機(jī)角度考慮一些計(jì)算,因?yàn)楹芏鄶?shù)學(xué)理論都是看的連續(xù)型問題,如何讓計(jì)算機(jī)利用離散迭代的方式計(jì)算,都是數(shù)值分析里面講的,舉個(gè)例子,求導(dǎo),定義上是一個(gè)極限,數(shù)值求導(dǎo)怎么整,可以了解一下
- 離散數(shù)學(xué):計(jì)算機(jī)類專業(yè)必修,目標(biāo)和數(shù)值分析類似,但是探索廣度更大,圖論、因果邏輯之類的都在這里面談及,尤其圖論,劃重點(diǎn)
- 隨機(jī)過程:個(gè)人認(rèn)為這里面難度最高的一塊吧,HMM之類的都在這里面,后面衍生就是概率圖模型,或者說隨機(jī)過程某種程度就算概率圖,我的理解不是很深,有錯(cuò)誤可以指正
- 信息論:尤其是決策樹有關(guān)理論,很多都來自信息論,信息熵之類的,就是從香農(nóng)的理論來的,前面幾塊可以看看,當(dāng)然了,只求理解的話,統(tǒng)計(jì)學(xué)習(xí)方法里面談的也足夠
再深入的,實(shí)際更加用不上了,要上面喂不飽你,實(shí)變函數(shù)、復(fù)變函數(shù)、微分方程、抽象代數(shù)、混沌學(xué)、實(shí)分析等內(nèi)容可以了解一下,這些東西個(gè)人感覺至少領(lǐng)先時(shí)代100年,保守估計(jì)的,我們活不到的未來會(huì)發(fā)揮很大作用,但是具體是哪個(gè)我們不知道,畢竟歷史大浪淘沙,至于目前數(shù)學(xué)最難的部分是類似陶哲軒做的調(diào)和分析之類的,有興趣可以繼續(xù)挑戰(zhàn)哈哈哈。
知識(shí)點(diǎn)角度
知識(shí)點(diǎn)角度去談可能會(huì)非常零散,遍布很多細(xì)節(jié)學(xué)科,但是很多學(xué)科下其實(shí)有些東西用的并不是特別多,我簡單談一談吧。
- 有關(guān)矩陣方面的計(jì)算。線性方程組、矩陣基本計(jì)算、特征值特征向量都是基操,建議看看矩陣分解的內(nèi)容,對(duì)embedding理解有很大好處。
- 微積分。一元微積分是基操,至少要會(huì)求吧,推薦想深入學(xué)習(xí)的人還是理解一下概念,尤其到極限的部分,當(dāng)然了,有關(guān)一些理論證明其實(shí)可以跳過。多元微積分會(huì)在一元的基礎(chǔ)上稍微復(fù)雜一些,但一元的扎實(shí)了其實(shí)二元甚至多元理解起來不會(huì)太難。微分一定要懂,積分可以根據(jù)自己的需求。
- 基本的概率統(tǒng)計(jì)知識(shí)。古典概型開始,到基本的分布,數(shù)學(xué)期望方差,條件概率,甚至到一些常見的分布,二項(xiàng)、泊松、正態(tài)等等,然后是后面有關(guān)參數(shù)估計(jì)的東西要理解,尤其是點(diǎn)估計(jì)里面的矩估計(jì)和極大似然估計(jì)。假設(shè)檢驗(yàn),可以考慮基本的有關(guān)兩個(gè)樣本總體的均值方差之類的對(duì)比,可以看看,在現(xiàn)實(shí)中有用,親測。
- 最優(yōu)化方法里面有關(guān)梯度的內(nèi)容,最速下降法——梯度方法的代表方法,然后是牛頓法、共軛梯度法,這些都是求解機(jī)器學(xué)習(xí)模型里面重要的方法,另外有關(guān)KKT條件之類的,建議了解一下。
- 離散數(shù)學(xué)建議全部拿下,沒有理由。計(jì)算機(jī)內(nèi)一個(gè)非常重要的計(jì)算概念就是“離散”,沒有連續(xù),所以這塊的理論一定要熟練掌握,劃重點(diǎn),圖論。
- 對(duì)底層計(jì)算方法有興趣的,數(shù)值分析了解一下,例如導(dǎo)數(shù)求導(dǎo)在離散角度是怎么做的,這個(gè)在自己手寫算法的時(shí)候很有用,至于什么時(shí)候要求導(dǎo),想想梯度下降法。
- 多元統(tǒng)計(jì)分析,主要是聚類分析、判別分析、主成分分析、因子分析等,都可以看看,在實(shí)現(xiàn)處理、特征工程方面都有很大用處,有的甚至就已經(jīng)是所謂的機(jī)器學(xué)習(xí)模型了。
學(xué)習(xí)方法
不知道有多少人跳過上面的看過來,我直接說建議吧。
- 跟著課本的樣子去推導(dǎo)(不是抄書!要理解理論細(xì)節(jié))
- 應(yīng)試,就需要背點(diǎn)定理、做點(diǎn)題目
- 記住的難度很大,時(shí)間長就忘記,如果你硬是要記住,那就用吧,找些渠道用,例如學(xué)點(diǎn)更加深度的東西
- 尤其是做算法開發(fā)的,雖然工作需要你調(diào)包就能完事,但是還是建議多看看資料,論文博客之類的,不要跳過理論部分,否則你遲早會(huì)忘記(前幾天我居然忘了特征值和特征向量怎么求)
- 多換幾本書看,有時(shí)候一本書不夠,你就多看幾本書比對(duì)著看
- 針對(duì)數(shù)學(xué)類本身,個(gè)人其實(shí)不太建議開視頻,看書會(huì)比視頻效果好。原因有下面幾個(gè):
- 講的快慢影響個(gè)人理解的節(jié)奏,書能自己控速
- 講過了就過了,很難照著他的樣子做,會(huì)產(chǎn)生“你已經(jīng)會(huì)了”的錯(cuò)覺
- 有時(shí)候有些人會(huì)因?yàn)樽约簳?huì)了而用“顯然”跳過正好你不知道的部分
- 數(shù)學(xué)敏感性沒起來之前,盡量找集中的大塊時(shí)間去學(xué)習(xí),足夠的時(shí)間才能夠讓你有一些突破性理解,而數(shù)學(xué)需要經(jīng)歷那個(gè)突破的過程
往后說,對(duì)于做算法的同學(xué),尤其是已經(jīng)入了行的,我其實(shí)不建議單獨(dú)花時(shí)間惡補(bǔ)數(shù)學(xué),而是面向需求看,他不會(huì)為你的工作進(jìn)展帶來困難時(shí),其實(shí)必要性不大,除非是這幾種情況:
- 找工作,需要了解自己平時(shí)調(diào)的包的具體細(xì)節(jié),但自己受限于數(shù)學(xué)能力,需要提升
- 模型創(chuàng)新時(shí),需要讀懂別人的論文時(shí)
至于做科研的同學(xué),尤其是奔著頂會(huì)去的同學(xué),建議建議好好扎實(shí)數(shù)學(xué):
- 別人的論文你要看懂
- 你的模型具體怎么計(jì)算,一來知道過程,二來要知道表達(dá)方式,來舉個(gè)栗子吧
- 寫出卷積計(jì)算的表達(dá)式(評(píng)論看看有多少人第一反應(yīng)寫不出來)
所以綜合起來,最好是根據(jù)自己的需求來補(bǔ)充即可,除非你真的學(xué)不下去,看不懂,否則不建議從頭開始補(bǔ),成本高收益小。
部分資料推薦
很多人找我要資料,或者問具體問題啥的,我想說——現(xiàn)在的資料收集門檻其實(shí)特別低,網(wǎng)絡(luò)上還是圖書館,都建議大家多去看看,不缺學(xué)習(xí)材料。
咳咳恩,我簡單推薦一些比較關(guān)鍵的,其他的,我不建議大家全都學(xué),部分內(nèi)容和學(xué)科也不需要全部掌握,我建議的學(xué)習(xí)方法是在一定基礎(chǔ)get后,根據(jù)需求去學(xué)和看,有高數(shù)線代概統(tǒng)3劍客在手,其他的東西基本不會(huì)在知識(shí)上卡住你了,除非想不開要去弄抽代甚至更高級(jí)的東西。
首先,高數(shù)看同濟(jì)大學(xué)的,基本是業(yè)內(nèi)首推吧,我自己是看華東師范的數(shù)分,高數(shù)更傾向于教大家怎么去計(jì)算,對(duì)原理的探索其實(shí)不是很多,而數(shù)分相反。至于針對(duì)算法的同學(xué),弄懂高數(shù)足夠,知道怎么求微積分足夠。
線代的話,我首推是我一位很好的朋友的文章,點(diǎn)擊這里直達(dá)。這兩個(gè)是我非常建議單獨(dú)拿來過一遍的材料,精推,所以少給一下,但是按照個(gè)人的習(xí)慣,在這些材料看不懂的情況下,我非常建議大家多去圖書館之類的看看相關(guān)書籍對(duì)你不懂得這塊的解釋,多讀幾遍比對(duì)后,會(huì)慢慢理解。
概率統(tǒng)計(jì)方面,就推一本吧,概率論與數(shù)理統(tǒng)計(jì),前面有關(guān)概率的建議全看,后面有關(guān)數(shù)理統(tǒng)計(jì)的,點(diǎn)估計(jì)+一些假設(shè)檢驗(yàn)看一下無妨。有些人希望我講講,額,一兩句話講不完,講完了估計(jì)也是一本書了,所以吧,自己去看可能比我來講更加合適吧,這個(gè)事情需要有耐心,真急不來。
再推薦一個(gè)口碑無敵好的視頻,就是李宏毅老師的
上面的是建議系統(tǒng)自學(xué)的,也是本科大一的基本水平,做算法的各位更要好好掌握。
其他的,建議大家根據(jù)需求學(xué)習(xí),對(duì)于不懂的概念進(jìn)行補(bǔ)充,然后對(duì)有興趣的內(nèi)容可以專題學(xué)習(xí),說白了,這些掌握《統(tǒng)計(jì)學(xué)習(xí)方法》看起來理應(yīng)不會(huì)太困難。
數(shù)據(jù)結(jié)構(gòu)與算法
這是一個(gè)數(shù)學(xué)專業(yè)也會(huì)學(xué),計(jì)算機(jī)專業(yè)也會(huì)涉及但是多少有點(diǎn)不懂,且筆試面試經(jīng)??嫉臇|西,所以想單獨(dú)拿來聊一下。
首先,對(duì)于做科研的同學(xué),有關(guān)時(shí)間和空間復(fù)雜度的理論,要求不是很高,除非你嘗試通過提升某個(gè)算法的性能,例如GBDT到XGBOOST、LightGBM等,否則,可以不用學(xué)太深,你的目標(biāo)只是,有一個(gè)思路,能翻譯為代碼,足夠。
對(duì)于要找工作的同學(xué),尤其是工程上的,那就要求你是個(gè)老司機(jī)了。
首先,這個(gè)是大多數(shù)計(jì)算機(jī)類專業(yè)和部分?jǐn)?shù)學(xué)類專業(yè)的基礎(chǔ)課,如果是沒有上過,其實(shí)可以考慮get起來。
- 慕課網(wǎng)、牛客網(wǎng)之類的網(wǎng)絡(luò)課程挺不錯(cuò)的,不做廣告哈
- 一些課本其實(shí)看看也很適合入門
另一方面,大部分人是需要面對(duì)實(shí)戰(zhàn)和面試筆試的,所以還是要多做一些練習(xí),重點(diǎn)是要?jiǎng)邮郑?/p>
- letcode、劍指offer還是經(jīng)典
- 大廠面經(jīng)筆經(jīng),好好看看
很多時(shí)候,希望代碼能夠在性能上有進(jìn)一步提升,非常建議大家做一些專題的進(jìn)階。
- 算法導(dǎo)論,最近在看,感覺打開了新的大門,不過感覺有些同學(xué)可能看不下去
- ?。∷惴?以及 算法,這兩本書可能看起來會(huì)比較舒服
當(dāng)然了,很多人會(huì)問設(shè)計(jì)計(jì)算機(jī)語言的問題。
- python的給一本——史世強(qiáng)老師翻譯的高效算法,感覺是python有關(guān)算法的一本不錯(cuò)的書
- c++和java,我建議大家至少會(huì)一個(gè),github上有很多教程,感覺都不錯(cuò),可以考慮找一個(gè),完整的過一遍
部分問題專題
有些人通過后臺(tái)等方式問了我一些問題,我這里集中回答一下。
Q: 有關(guān)數(shù)據(jù)科學(xué)和具體深度學(xué)習(xí)之間的關(guān)系。數(shù)據(jù)科學(xué)到什么程度算是掌握。
A: 我本身對(duì)數(shù)據(jù)科學(xué)本身沒有明顯的概念,甚至感覺有點(diǎn)類似統(tǒng)計(jì)學(xué)的概念額,所以我不太敢說。至于掌握到什么程度,額,說一本可能有些偏差但是還挺好的書——數(shù)據(jù)挖掘?qū)д摚@本書看完,感覺數(shù)據(jù)科學(xué)也能理解怎么回事了。
結(jié)束語
呃呃呃,看著字?jǐn)?shù)已經(jīng)接近6k了哈哈哈,不知道對(duì)大家有沒有幫助吧,今天不打算談太多有關(guān)理論上的東西,只是希望大家能對(duì)數(shù)學(xué)更有信心,把數(shù)學(xué)學(xué)會(huì),突破自己前進(jìn)的瓶頸吧。最后強(qiáng)調(diào)幾個(gè)點(diǎn)。
- 數(shù)學(xué)決定了上限,計(jì)算機(jī)能力決定了下限,兩個(gè)都很重要,如果希望持續(xù)進(jìn)步,那數(shù)學(xué)關(guān)遲早要破。
- 看什么材料,都要看完!!行百里者半九十,能看完,你就有質(zhì)變
- 材料一方面,多找一些是另一方面,不要做伸手黨,自己多在各個(gè)領(lǐng)域里面查,最適合自己的才是最好的
- 不要害怕,迎難而上,不難的東西,大家都會(huì),那還能分出高下嗎
最后祝大家加油吧!