對應大多數(shù)人而言舔糖,做機器學習等各種算法娱两,最難突破的就兩個點,一個是計算機能力金吗,另一個是數(shù)學能力十兢,由于現(xiàn)在有關技術逐漸成熟,教程和課程都逐漸完善摇庙,另外這個領域多半是計算機專業(yè)出身的同學旱物,因此計算機能力慢慢變成了基操,大家都覺得還合適卫袒,但是數(shù)學宵呛,從本科各位同學學高數(shù)就開始嗷嗷叫了,然而要吃算法這碗飯夕凝,不得不邁過這座山宝穗,所以户秤,還是得生啃。
而我逮矛,是從比高數(shù)更難的數(shù)分鸡号,比現(xiàn)代更難的高代過來,走過實變復變出來的一個普通的數(shù)學系同學须鼎,跌跌撞撞的走來感覺有些經(jīng)驗可以和大家分享膜蠢,結合著我昨天收集的信息,給大家談談在這個領域莉兰,數(shù)學的作用以及一些學習方法吧挑围,如有補充可以看看評論。
懶人目錄
- 擅長數(shù)學的好處
- 算法領域對數(shù)學的要求
- 需要掌握哪些知識
- 學習方法
- 部分資料推薦
- 有關數(shù)據(jù)結構與算法
- 部分問題專題
擅長數(shù)學的好處
在知乎里很多人把數(shù)學系的人干其他事情稱為“猛虎下山”糖荒,因為了解了基本的方法論后對于具體問題會有著獨特的角度和更為嚴謹?shù)乃季S方法杉辙。那么在算法領域,擅長數(shù)學會有什么好處捶朵,我來簡單討論一下蜘矢。
首先,擅長數(shù)學的人综看,會對模型有更加深入的理解品腹。雖然現(xiàn)在在技術上,tf红碑、sklearn之類的已經(jīng)能夠支持基本算法的操作舞吭,但是,對于不理解模型的人析珊,那終究是積木羡鸥,只能通過搭積木+實驗的方法,上限明顯忠寻,理解了理論惧浴,你能針對問題給處更為細節(jié)的方案,更加敢于大刀闊斧的進行修改奕剃,大幅提升性能衷旅。
第二,數(shù)據(jù)敏感性與分析診斷能力纵朋。這個是來源于常年看著數(shù)據(jù)和進行計算后得到的經(jīng)驗柿顶,不少職場老司機同樣也有,在進行分析的時候經(jīng)常能發(fā)現(xiàn)邊緣但是關鍵的問題倡蝙,并在實施前就想好策略解決九串,另一方面對于出現(xiàn)的問題绞佩,能迅速通過計算和分析得到結果寺鸥,之前的文章“評價指標設計”里面的自己設置評價指標猪钮,其實就依賴這種能力。雖說這種能力前輩都能有胆建,但是一進職場就有烤低,這個就和你的數(shù)學能力有關了。
第三笆载,更加精準的理解和表達扑馁。對于模型你能寫出足夠精細的偽代碼,或者是能用公式表達凉驻,那你對這個模型的理解才真正的到家腻要,可以參考現(xiàn)在科研的論文,公式已經(jīng)是交流的基操了涝登。
第三雄家,就是筆面試了,筆面試常常會問你一些有關模型推導方面的問題胀滚,這就一定會涉及數(shù)學了趟济,手寫支持向量機,推導BP的反向傳播咽笼,這都是最基本的顷编,然后是一些方向專精的,推薦系統(tǒng)里面的FM剑刑,NLP中的W2V等等媳纬,最最功利的,我們要理解這些模型并在面試中說個所以然來施掏,那就肯定要懂數(shù)學层宫。
算法領域對數(shù)學的要求
那么問題來了,算法領域需要數(shù)學到什么程度呢其监,個人的理解萌腿,你越做的深入,需要的就越多抖苦,到后面很可能就成為你突破的瓶頸毁菱,再者,很多人把數(shù)學基礎理解為簡單的計算方法上锌历,矩陣贮庞、求導等,而實際上遠遠不止如此究西,那在算法領域窗慎,具體是什么要求。
入門階段,這個階段大部分人在過類似《統(tǒng)計學習方法》之類的基礎遮斥,而這本書事實上需要一定的數(shù)學基礎峦失,尤其是一些基本的數(shù)學概念,因此在此階段术吗,要達到的水平應該是大一數(shù)學的水平尉辑,知道基本的概念即可。
進階階段较屿,這時候會有些人發(fā)現(xiàn)即使懂這些基礎隧魄,但是有些細節(jié)還是不懂“為什么”,例如SVM為什么要求對偶隘蝎,SGD為什么能找最優(yōu)解等购啄,這時候需要一些在原本數(shù)學概念基礎上的一些理論,前面兩個例如對應的都是運籌與優(yōu)化方向的知識細節(jié)嘱么。當然了闸溃,這階段其實很多人就止步了,畢竟我使用SVM并不需要知道SVM是什么也能去用拱撵,但是你要是能邁過這關辉川,你會發(fā)現(xiàn)你對數(shù)據(jù)本身特點與聯(lián)系模型提出方案的能力會有質的提升,你所謂的“經(jīng)驗”可能有了更加扎實的理論保證拴测,有的時候可能只是模糊的感覺乓旗,但是就感覺在你的三觀下某個模型的結果就是不好,那你可以避開了集索。
在進一步屿愚,你能根據(jù)自己的理解去設計模型了。你能分析損失函數(shù)是否合適务荆,你能找到交叉熵和MSE做損失的差別妆距,你能根據(jù)預測性能指標加bad case分析,來診斷模型的缺陷函匕,根據(jù)模型的缺陷提出改進建議娱据,甚至是創(chuàng)新,在科研上盅惜,你就能做一些理論創(chuàng)新中剩,在技術上,你能針對獨一無二的問題提出個性化方案抒寂,這就是專家了结啼。
很多人可能會說,工業(yè)界很多時候用的都是基線屈芜,不需要多高端郊愧,有了數(shù)據(jù)就懟模型就好了朴译,為什么需要這么高端的東西。我只想說属铁,可能大部分內(nèi)容確實是所謂的low的東西眠寿,但是你在進行迭代的時候,有自己的思路終究能給出更為合適的方案红选,LR萬能,但是萬能的代價是性能不會突出姆另,相信大家都能理解喇肋。
有時候也沒有必要分的那么清,我用人話來表達一下吧迹辐,無論科研還是工程蝶防,都是這三個角度判斷:
- 看得懂公式
- 能把具體的模型演繹理解后轉化為代碼
- 在一定條件下你可能要下手改進,以更好地解決你的問題
- 必要的溝通交流明吩,寫論文也好间学,文檔也好,需要公式支持你的解釋
你的數(shù)學水平印荔,能在你的職業(yè)狀態(tài)下滿足上面需求低葫,我覺得就完全足夠了,畢竟數(shù)學對絕大多數(shù)人來說就和英語一樣是工具仍律。
需要掌握那些知識
要說數(shù)學知識本身嘿悬,其實并不是很多,我結合著需要的程度和大家聊一下水泉。
數(shù)學學科角度
首先是最基礎的數(shù)學善涨,這個對大部分大學理工類專業(yè)而言就是基礎課吧。個人建議要進這行下面的都要掌握草则。
- 數(shù)學基礎:
- 高數(shù)(數(shù)分):微積分钢拧,多元微積分(甚至會涉及矩陣求導之類的內(nèi)容)
- 線代(高代):線性方程組,矩陣變換炕横,行列式源内,線性空間,特征值特征向量
- 概率論:期望方差份殿,古典概型姿锭,全概率貝葉斯,各種常見分布
然后是一些比較進一步的內(nèi)容伯铣,可能會涉及不同的學科說法呻此,我這里以我自己接觸的為例,大家聽名字應該都會了解一些腔寡。不需要全部掌握焚鲜,有需要或者有興趣看看無妨。
- 基礎進階:
- 最優(yōu)化方法:最速下降法,牛頓法等忿磅,包括KKT條件以及有關理論糯彬,先序知識是高數(shù)和線代,尤其是求導葱她,實質上求最優(yōu)值的核心就在于求導
- 矩陣論:花式矩陣分解撩扒,尤其是SVD等,在embedding等方面具有非常重要的地位
- 運籌學:尤其是在對偶理論一塊吨些,有些時候最優(yōu)化問題可以通過對偶能求出更好的數(shù)值解甚至精確解搓谆,例如SVM中的SMO求解方法
- 數(shù)理統(tǒng)計:重點在矩估計、極大似然估計等豪墅,至于假設檢驗泉手,可能會在模型評估階段會用到,如果有必要可以了解偶器,有時候類似單側檢驗之類的在AB實驗真的用過
- 多元統(tǒng)計分析:這個和機器學習有巨大重合斩萌,k-means之類的甚至都會談,包括PCA等
- 數(shù)值分析:從計算機角度考慮一些計算屏轰,因為很多數(shù)學理論都是看的連續(xù)型問題颊郎,如何讓計算機利用離散迭代的方式計算,都是數(shù)值分析里面講的霎苗,舉個例子袭艺,求導,定義上是一個極限叨粘,數(shù)值求導怎么整猾编,可以了解一下
- 離散數(shù)學:計算機類專業(yè)必修,目標和數(shù)值分析類似升敲,但是探索廣度更大答倡,圖論、因果邏輯之類的都在這里面談及驴党,尤其圖論瘪撇,劃重點
- 隨機過程:個人認為這里面難度最高的一塊吧,HMM之類的都在這里面港庄,后面衍生就是概率圖模型倔既,或者說隨機過程某種程度就算概率圖,我的理解不是很深鹏氧,有錯誤可以指正
- 信息論:尤其是決策樹有關理論渤涌,很多都來自信息論,信息熵之類的把还,就是從香農(nóng)的理論來的实蓬,前面幾塊可以看看茸俭,當然了,只求理解的話安皱,統(tǒng)計學習方法里面談的也足夠
再深入的调鬓,實際更加用不上了,要上面喂不飽你酌伊,實變函數(shù)腾窝、復變函數(shù)、微分方程居砖、抽象代數(shù)虹脯、混沌學、實分析等內(nèi)容可以了解一下悯蝉,這些東西個人感覺至少領先時代100年归形,保守估計的托慨,我們活不到的未來會發(fā)揮很大作用鼻由,但是具體是哪個我們不知道,畢竟歷史大浪淘沙厚棵,至于目前數(shù)學最難的部分是類似陶哲軒做的調和分析之類的蕉世,有興趣可以繼續(xù)挑戰(zhàn)哈哈哈。
知識點角度
知識點角度去談可能會非常零散婆硬,遍布很多細節(jié)學科狠轻,但是很多學科下其實有些東西用的并不是特別多,我簡單談一談吧彬犯。
- 有關矩陣方面的計算向楼。線性方程組、矩陣基本計算谐区、特征值特征向量都是基操湖蜕,建議看看矩陣分解的內(nèi)容,對embedding理解有很大好處宋列。
- 微積分昭抒。一元微積分是基操,至少要會求吧炼杖,推薦想深入學習的人還是理解一下概念灭返,尤其到極限的部分,當然了坤邪,有關一些理論證明其實可以跳過熙含。多元微積分會在一元的基礎上稍微復雜一些,但一元的扎實了其實二元甚至多元理解起來不會太難艇纺。微分一定要懂婆芦,積分可以根據(jù)自己的需求怕磨。
- 基本的概率統(tǒng)計知識。古典概型開始消约,到基本的分布肠鲫,數(shù)學期望方差,條件概率或粮,甚至到一些常見的分布导饲,二項、泊松氯材、正態(tài)等等渣锦,然后是后面有關參數(shù)估計的東西要理解,尤其是點估計里面的矩估計和極大似然估計氢哮。假設檢驗袋毙,可以考慮基本的有關兩個樣本總體的均值方差之類的對比,可以看看冗尤,在現(xiàn)實中有用听盖,親測。
- 最優(yōu)化方法里面有關梯度的內(nèi)容裂七,最速下降法——梯度方法的代表方法皆看,然后是牛頓法、共軛梯度法背零,這些都是求解機器學習模型里面重要的方法腰吟,另外有關KKT條件之類的,建議了解一下徙瓶。
- 離散數(shù)學建議全部拿下毛雇,沒有理由。計算機內(nèi)一個非常重要的計算概念就是“離散”侦镇,沒有連續(xù)灵疮,所以這塊的理論一定要熟練掌握,劃重點虽缕,圖論始藕。
- 對底層計算方法有興趣的,數(shù)值分析了解一下氮趋,例如導數(shù)求導在離散角度是怎么做的伍派,這個在自己手寫算法的時候很有用,至于什么時候要求導剩胁,想想梯度下降法诉植。
- 多元統(tǒng)計分析,主要是聚類分析昵观、判別分析晾腔、主成分分析舌稀、因子分析等,都可以看看灼擂,在實現(xiàn)處理壁查、特征工程方面都有很大用處,有的甚至就已經(jīng)是所謂的機器學習模型了剔应。
學習方法
不知道有多少人跳過上面的看過來睡腿,我直接說建議吧。
- 跟著課本的樣子去推導(不是抄書峻贮!要理解理論細節(jié))
- 應試席怪,就需要背點定理、做點題目
- 記住的難度很大纤控,時間長就忘記挂捻,如果你硬是要記住,那就用吧船万,找些渠道用刻撒,例如學點更加深度的東西
- 尤其是做算法開發(fā)的,雖然工作需要你調包就能完事唬涧,但是還是建議多看看資料疫赎,論文博客之類的盛撑,不要跳過理論部分碎节,否則你遲早會忘記(前幾天我居然忘了特征值和特征向量怎么求)
- 多換幾本書看,有時候一本書不夠抵卫,你就多看幾本書比對著看
- 針對數(shù)學類本身狮荔,個人其實不太建議開視頻,看書會比視頻效果好介粘。原因有下面幾個:
- 講的快慢影響個人理解的節(jié)奏殖氏,書能自己控速
- 講過了就過了,很難照著他的樣子做姻采,會產(chǎn)生“你已經(jīng)會了”的錯覺
- 有時候有些人會因為自己會了而用“顯然”跳過正好你不知道的部分
- 數(shù)學敏感性沒起來之前雅采,盡量找集中的大塊時間去學習,足夠的時間才能夠讓你有一些突破性理解慨亲,而數(shù)學需要經(jīng)歷那個突破的過程
往后說婚瓜,對于做算法的同學,尤其是已經(jīng)入了行的刑棵,我其實不建議單獨花時間惡補數(shù)學巴刻,而是面向需求看,他不會為你的工作進展帶來困難時蛉签,其實必要性不大胡陪,除非是這幾種情況:
- 找工作沥寥,需要了解自己平時調的包的具體細節(jié),但自己受限于數(shù)學能力柠座,需要提升
- 模型創(chuàng)新時邑雅,需要讀懂別人的論文時
至于做科研的同學,尤其是奔著頂會去的同學妈经,建議建議好好扎實數(shù)學:
- 別人的論文你要看懂
- 你的模型具體怎么計算蒂阱,一來知道過程,二來要知道表達方式狂塘,來舉個栗子吧
- 寫出卷積計算的表達式(評論看看有多少人第一反應寫不出來)
所以綜合起來录煤,最好是根據(jù)自己的需求來補充即可,除非你真的學不下去荞胡,看不懂妈踊,否則不建議從頭開始補,成本高收益小泪漂。
部分資料推薦
很多人找我要資料廊营,或者問具體問題啥的,我想說——現(xiàn)在的資料收集門檻其實特別低萝勤,網(wǎng)絡上還是圖書館露筒,都建議大家多去看看,不缺學習材料敌卓。
咳咳恩慎式,我簡單推薦一些比較關鍵的,其他的趟径,我不建議大家全都學瘪吏,部分內(nèi)容和學科也不需要全部掌握,我建議的學習方法是在一定基礎get后蜗巧,根據(jù)需求去學和看掌眠,有高數(shù)線代概統(tǒng)3劍客在手,其他的東西基本不會在知識上卡住你了幕屹,除非想不開要去弄抽代甚至更高級的東西蓝丙。
首先,高數(shù)看同濟大學的望拖,基本是業(yè)內(nèi)首推吧渺尘,我自己是看華東師范的數(shù)分,高數(shù)更傾向于教大家怎么去計算靠娱,對原理的探索其實不是很多沧烈,而數(shù)分相反。至于針對算法的同學像云,弄懂高數(shù)足夠锌雀,知道怎么求微積分足夠蚂夕。
線代的話,我首推是我一位很好的朋友的文章腋逆,點擊這里直達婿牍。這兩個是我非常建議單獨拿來過一遍的材料,精推惩歉,所以少給一下等脂,但是按照個人的習慣,在這些材料看不懂的情況下撑蚌,我非常建議大家多去圖書館之類的看看相關書籍對你不懂得這塊的解釋上遥,多讀幾遍比對后,會慢慢理解争涌。
概率統(tǒng)計方面粉楚,就推一本吧,概率論與數(shù)理統(tǒng)計亮垫,前面有關概率的建議全看模软,后面有關數(shù)理統(tǒng)計的,點估計+一些假設檢驗看一下無妨饮潦。有些人希望我講講燃异,額,一兩句話講不完继蜡,講完了估計也是一本書了回俐,所以吧,自己去看可能比我來講更加合適吧壹瘟,這個事情需要有耐心鲫剿,真急不來鳄逾。
再推薦一個口碑無敵好的視頻稻轨,就是李宏毅老師的
上面的是建議系統(tǒng)自學的,也是本科大一的基本水平雕凹,做算法的各位更要好好掌握殴俱。
其他的,建議大家根據(jù)需求學習枚抵,對于不懂的概念進行補充线欲,然后對有興趣的內(nèi)容可以專題學習,說白了汽摹,這些掌握《統(tǒng)計學習方法》看起來理應不會太困難李丰。
數(shù)據(jù)結構與算法
這是一個數(shù)學專業(yè)也會學,計算機專業(yè)也會涉及但是多少有點不懂逼泣,且筆試面試經(jīng)撑棵冢考的東西舟舒,所以想單獨拿來聊一下。
首先嗜憔,對于做科研的同學秃励,有關時間和空間復雜度的理論,要求不是很高吉捶,除非你嘗試通過提升某個算法的性能夺鲜,例如GBDT到XGBOOST、LightGBM等呐舔,否則币励,可以不用學太深,你的目標只是珊拼,有一個思路榄审,能翻譯為代碼,足夠杆麸。
對于要找工作的同學搁进,尤其是工程上的,那就要求你是個老司機了昔头。
首先饼问,這個是大多數(shù)計算機類專業(yè)和部分數(shù)學類專業(yè)的基礎課,如果是沒有上過揭斧,其實可以考慮get起來莱革。
- 慕課網(wǎng)、哦锟客網(wǎng)之類的網(wǎng)絡課程挺不錯的秒际,不做廣告哈
- 一些課本其實看看也很適合入門
另一方面呕缭,大部分人是需要面對實戰(zhàn)和面試筆試的,所以還是要多做一些練習,重點是要動手剩膘!
- letcode邦邦、劍指offer還是經(jīng)典
- 大廠面經(jīng)筆經(jīng)爪飘,好好看看
很多時候哆档,希望代碼能夠在性能上有進一步提升,非常建議大家做一些專題的進階淆两。
- 算法導論断箫,最近在看,感覺打開了新的大門秋冰,不過感覺有些同學可能看不下去
- 爸僖濉!算法 以及 算法,這兩本書可能看起來會比較舒服
當然了埃撵,很多人會問設計計算機語言的問題尸诽。
- python的給一本——史世強老師翻譯的高效算法,感覺是python有關算法的一本不錯的書
- c++和java盯另,我建議大家至少會一個性含,github上有很多教程,感覺都不錯鸳惯,可以考慮找一個商蕴,完整的過一遍
部分問題專題
有些人通過后臺等方式問了我一些問題,我這里集中回答一下芝发。
Q: 有關數(shù)據(jù)科學和具體深度學習之間的關系绪商。數(shù)據(jù)科學到什么程度算是掌握。
A: 我本身對數(shù)據(jù)科學本身沒有明顯的概念辅鲸,甚至感覺有點類似統(tǒng)計學的概念額格郁,所以我不太敢說。至于掌握到什么程度独悴,額例书,說一本可能有些偏差但是還挺好的書——數(shù)據(jù)挖掘導論,這本書看完刻炒,感覺數(shù)據(jù)科學也能理解怎么回事了决采。
結束語
呃呃呃,看著字數(shù)已經(jīng)接近6k了哈哈哈坟奥,不知道對大家有沒有幫助吧树瞭,今天不打算談太多有關理論上的東西,只是希望大家能對數(shù)學更有信心爱谁,把數(shù)學學會晒喷,突破自己前進的瓶頸吧。最后強調幾個點访敌。
- 數(shù)學決定了上限凉敲,計算機能力決定了下限,兩個都很重要捐顷,如果希望持續(xù)進步荡陷,那數(shù)學關遲早要破。
- 看什么材料迅涮,都要看完!徽龟!行百里者半九十叮姑,能看完,你就有質變
- 材料一方面,多找一些是另一方面传透,不要做伸手黨耘沼,自己多在各個領域里面查,最適合自己的才是最好的
- 不要害怕朱盐,迎難而上群嗤,不難的東西,大家都會兵琳,那還能分出高下嗎
最后祝大家加油吧狂秘!