一門基礎(chǔ)學(xué)科,也能如此硬核?

作者 | 黃申

“程序員不需要學(xué)數(shù)學(xué),因?yàn)楣ぷ髦懈居貌坏?。有那功夫,還不如認(rèn)真把設(shè)計(jì)模式、計(jì)算機(jī)網(wǎng)絡(luò)、操作系統(tǒng)等硬知識(shí)學(xué)好?!?這是很多人的觀點(diǎn),是的,作為程序員,你不需要任何數(shù)學(xué)知識(shí),也能寫代碼。

但是,編程的世界不止條件和循環(huán)語句,程序員的人生應(yīng)該是創(chuàng)造的舞臺(tái),只要想在這個(gè)領(lǐng)域持續(xù)深耕,學(xué)好數(shù)學(xué)就是充分必要條件,會(huì)決定一個(gè)程序員未來的發(fā)展?jié)摿Α?/p>

往大了說,數(shù)學(xué)是一種思維模式,考驗(yàn)的是一個(gè)人歸納、總結(jié)和抽象的能力,放到程序員的世界,就是解決問題的能力。往小了說,不管是數(shù)據(jù)結(jié)構(gòu)與算法,還是程序設(shè)計(jì),其底層原理和思路大都源自數(shù)學(xué)。

所以,很多大公司在招人時(shí),都會(huì)優(yōu)先考慮數(shù)學(xué)專業(yè)的畢業(yè)生,因?yàn)閿?shù)學(xué)基礎(chǔ)好,編程會(huì)更容易上手。在大數(shù)據(jù)和智能化的時(shí)代,學(xué)好數(shù)學(xué)更是門檻本身。

學(xué)習(xí)數(shù)學(xué)的正確姿勢(shì),聽聽他們?cè)趺凑f?

劉超 | 《趣談網(wǎng)絡(luò)協(xié)議》作者:“學(xué)數(shù)學(xué)就像學(xué)一門新技術(shù)”

程序員是否需要學(xué)好數(shù)學(xué)?原本學(xué)數(shù)學(xué)分析、概率論、線性代數(shù)的時(shí)候,我也沒想到數(shù)學(xué)和寫程序有啥關(guān)系,但是隨著研究的開源軟件越來越多,我發(fā)現(xiàn)很多技術(shù)深入下去,本質(zhì)就是數(shù)學(xué)。

程序員應(yīng)該怎么學(xué)習(xí)數(shù)學(xué)呢?我不建議你將大學(xué)的數(shù)學(xué)書拿出來啃一遍,一來耗費(fèi)大量時(shí)間,二來和實(shí)際應(yīng)用結(jié)合不起來,往往該看的忽略了,不該看的費(fèi)了半天勁用不上,過一陣又忘了。

我們了解一個(gè)新技術(shù)有三個(gè)階段,第一階段是,怎么使用;第二階段是,如何實(shí)現(xiàn),原理是什么;第三階段是,為什么這樣實(shí)現(xiàn)。學(xué)數(shù)學(xué)和學(xué)一門新技術(shù)一樣,也有這樣三個(gè)階段,先用起來,了解原理,然后了解為什么。

用一句話來說,我們不能為了數(shù)學(xué)而學(xué)數(shù)學(xué),學(xué)數(shù)學(xué)要和具體的應(yīng)用結(jié)合在一起。

徐文浩 | bothub.ai創(chuàng)始人:“先廣度,再深度”

隨著過去幾年深度學(xué)習(xí)成為程序員界的顯學(xué),不少程序員開始回頭復(fù)習(xí)微積分、概率論和線性代數(shù)這樣的基礎(chǔ)數(shù)學(xué)課,乃至開始學(xué)習(xí)最優(yōu)化、博弈論這樣的應(yīng)用數(shù)學(xué)課。我自己則是因?yàn)閺?010年一頭扎入了計(jì)算廣告的大坑之后,重新開始學(xué)習(xí)數(shù)學(xué)。

可以說,這次重新學(xué)習(xí)數(shù)學(xué),為我自己推開了程序世界中另一扇門,使得我在埋頭寫代碼之外,有機(jī)會(huì)重新從另一個(gè)角度,去認(rèn)識(shí)和理解“程序”和“問題的解決方案”這兩件事情。

  • 我為什么要學(xué)點(diǎn)數(shù)學(xué)?

投入時(shí)間學(xué)習(xí)數(shù)學(xué),于我來說主要是兩個(gè)原因,一來,在工作中用得上;二來,學(xué)數(shù)學(xué)原本就是個(gè)好玩兒的事。

譬如說,過去幾年火起來的深度學(xué)習(xí),以及之前沒那么火,但是實(shí)際上早早就在搜索、廣告這些領(lǐng)域,應(yīng)用的機(jī)器學(xué)習(xí)和推薦算法。這里面其實(shí)就是結(jié)合了微積分、線性代數(shù)、概率論之后的最優(yōu)化問題。

事實(shí)上,大部分應(yīng)用領(lǐng)域的核心解決方案,都是把應(yīng)用領(lǐng)域的問題,形式化為一個(gè)個(gè)數(shù)學(xué)問題。在找到數(shù)學(xué)問題的“解法”之后,用寫程序的方式翻譯成實(shí)際應(yīng)用的“算法”。而能夠應(yīng)用“數(shù)學(xué)”的方式來解決問題,是從一個(gè)只能套用現(xiàn)成方案的“碼農(nóng)”,向能夠?qū)⑿聠栴}形式化、并找出創(chuàng)新解決方案的“研發(fā)工程師”邁出的第一步。

很多問題當(dāng)你知道如何用數(shù)學(xué)來解決的時(shí)候,常常會(huì)有醍醐灌頂?shù)母杏X。譬如當(dāng)我第一次搞明白,廣告中的競(jìng)價(jià)問題,居然能夠變成一個(gè)博弈論中“尋找上策均衡”的問題,并且能夠通過簡(jiǎn)簡(jiǎn)單單的公式表示出來的時(shí)候,我是很有滿足感的。

此外,一旦熟悉了機(jī)器學(xué)習(xí)中用到的數(shù)學(xué)知識(shí),很多想要解決的系統(tǒng)問題,都能通過定義更好的數(shù)學(xué)優(yōu)化目標(biāo),變成一個(gè)能夠找到最優(yōu)解的程序算法,最后通過寫個(gè)程序,翻譯成數(shù)學(xué)問題來解決,這個(gè)過程帶給我巨大的身心愉悅。

  • 我是如何學(xué)數(shù)學(xué)的?

數(shù)學(xué)整個(gè)領(lǐng)域很大,如果想要學(xué)點(diǎn)什么,我建議從工作相關(guān)的領(lǐng)域開始,先廣度,再深度。

從工作相關(guān)的領(lǐng)域開始,是讓自己一是能有實(shí)際用得上學(xué)到的知識(shí)的機(jī)會(huì),二是日常工作中容易耳濡目染,相當(dāng)于常常在復(fù)習(xí)。而先有廣度,是讓自己在心中有一個(gè)問題到解決方法的“地圖”,遇到具體的問題能夠?qū)Φ蒙?,容易獲得正反饋;然后再有深度,具體去對(duì)一個(gè)特定的主題學(xué)習(xí)應(yīng)用。

當(dāng)開始深入學(xué)一個(gè)特定問題的時(shí)候,最好的方式是,追一門在線課程,譬如Coursera、TEDx,或者在極客時(shí)間上找一門課程來學(xué)習(xí)。

這是因?yàn)?,在線課程有明確的節(jié)奏,通常還會(huì)提供作業(yè)和測(cè)驗(yàn)。通過作業(yè)和測(cè)驗(yàn),讓自己對(duì)自己的學(xué)習(xí)有一個(gè)聯(lián)系和反饋的過程。即使實(shí)踐中沒有足夠的應(yīng)用,過一段時(shí)間有些知識(shí)沒有那么熟悉了,但是也容易建立自己很快可以“撿”回來的信心,降低“復(fù)習(xí)”的啟動(dòng)成本。跟隨在線課程的節(jié)奏,可以有效避免“三天打漁兩天曬網(wǎng)”的惡習(xí),讓學(xué)習(xí)有始有終。

最后,給你介紹一個(gè)有程序員特色的學(xué)習(xí)方法,針對(duì)學(xué)習(xí)的內(nèi)容寫一點(diǎn)程序。把正在學(xué)習(xí)的問題的解法,寫一個(gè)算法實(shí)現(xiàn)出來。這是一個(gè)非常有效的練習(xí)方式。譬如學(xué)習(xí)線性代數(shù),理解仿射,反復(fù)讀書的效率對(duì)我來說,就不如找來Coding The Matrix,通過寫程序,讓學(xué)習(xí)、理解變得更深入。

王天一 | 《人工智能基礎(chǔ)課》《機(jī)器學(xué)習(xí)40講》作者:“數(shù)學(xué)是工具而非問題,是手段而非目的”

在數(shù)學(xué)的學(xué)習(xí)中,首要的問題是明確需求。作為非數(shù)學(xué)專業(yè)出身的“外行”,我們使用數(shù)學(xué)的目的不是頂天,而是立地;不是上下求索艱深的理論問題,而是將生活中的具體問題抽象化,進(jìn)而加以解決。

因此,對(duì)于我們這些票友來說,學(xué)習(xí)數(shù)學(xué)的基礎(chǔ)在于經(jīng)驗(yàn)而非哲學(xué),比較實(shí)際的思路是秉持功利主義的原則,用多少學(xué)多少。掌握基本的線性代數(shù)與矩陣論、概率論與數(shù)理統(tǒng)計(jì)知識(shí)足以應(yīng)付日常的使用,盲目地好高騖遠(yuǎn)通常有害無益。理論化和公理化這些比較深邃的嘗試固然讓人著迷,但它們可能并沒有肉眼可見的實(shí)用性,對(duì)于絕大部分計(jì)算機(jī)從業(yè)者恐怕過于陽春白雪。

其次,在學(xué)習(xí)時(shí)還要理解數(shù)學(xué)的本質(zhì)。數(shù)學(xué)是工具而非問題,是手段而非目的。探索世界奧秘的學(xué)科是“格物窮理”的物理學(xué),相形之下,數(shù)學(xué)更像是個(gè)任人打扮的小姑娘,它存在的意義就是通過合理的設(shè)計(jì)簡(jiǎn)化物理學(xué)的研究。

正因如此,在數(shù)學(xué)中存在著各種各樣在現(xiàn)實(shí)中不可能出現(xiàn)的理想化模型(比如無窮小和極限的誕生),也存在著對(duì)同一個(gè)物理過程不同的建模方式(比如矩陣力學(xué)和波動(dòng)力學(xué))。充分理解數(shù)學(xué)的人造特質(zhì),可以在學(xué)習(xí)中少走很多無謂的彎路。

理解數(shù)學(xué)的工具屬性就會(huì)自然而然地引出了數(shù)學(xué)學(xué)習(xí)中的另一個(gè)關(guān)鍵點(diǎn),那就是工具設(shè)計(jì)的出發(fā)點(diǎn),也就是所謂的數(shù)學(xué)思想與數(shù)學(xué)邏輯。

任何一個(gè)工具都不是平白無故地設(shè)計(jì)出來的,它必然要解決某個(gè)特定的問題,比如線性代數(shù)與矩陣論是對(duì)具體對(duì)象的抽象表示與運(yùn)算,比如概率論和數(shù)理統(tǒng)計(jì)是對(duì)不確定性及其定型定量表示的建模。因此,在掌握每一種數(shù)學(xué)工具的微觀技巧之前,理解它們的宏觀目標(biāo)是更加重要的。只有掌握了工具誕生的背景與目的,才有可能有效地使用它們。

在這里還要多說一句,數(shù)學(xué)絕不僅僅是算術(shù),把主要精力放在計(jì)算上未免因小失大。在經(jīng)典科幻片《銀河系漫游指南》中,超級(jí)計(jì)算機(jī)告訴人們,世界的終極答案是“42”——這更像是對(duì)數(shù)字主義者善意嘲諷的一個(gè)梗。但對(duì)算術(shù)的過度強(qiáng)調(diào)并不鮮見,在相當(dāng)數(shù)量的現(xiàn)行數(shù)學(xué)教材中,講解線性代數(shù)時(shí)開篇便給出行列式的計(jì)算方法,這種編排著實(shí)讓人費(fèi)解。

具體到數(shù)學(xué)每個(gè)子學(xué)科的學(xué)習(xí)方法上,相關(guān)的經(jīng)驗(yàn)教訓(xùn)已然汗牛充棟,很多內(nèi)容都無需在此贅言。但在我看來,學(xué)習(xí)時(shí)值得突出強(qiáng)調(diào)的一點(diǎn)是舉一反三的能力。同一種工具及其背后的思想可以出現(xiàn)在不同的場(chǎng)景下,解決不同的問題,但是一旦深入到本質(zhì)層面,就會(huì)發(fā)現(xiàn)它們實(shí)際上是相通的。如何透過現(xiàn)象看本質(zhì),將不同場(chǎng)景融會(huì)貫通,才是值得鍛煉的高級(jí)能力。

同一個(gè)工具存在不同應(yīng)用的例子不勝枚舉:

  • 特征向量計(jì)算的是系統(tǒng)的不動(dòng)點(diǎn),在數(shù)據(jù)降維中有舉足輕重的作用,但如果熟悉電子通信的話你就會(huì)知道,對(duì)線性時(shí)不變系統(tǒng)的分析(也就是各種變換)都是基于特征向量展開的;

  • 在給定隱馬爾可夫模型的觀測(cè)序列時(shí),可以利用維特比算法求解后驗(yàn)概率最大的狀態(tài)序列,將這一方法應(yīng)用在信道編碼中,就是最經(jīng)典的卷積碼譯碼算法;

  • 在分類問題中,以類間方差最大化為標(biāo)準(zhǔn),可以推導(dǎo)出線性判別分析和決策樹等模型,應(yīng)用在圖像處理中,類間方差最大化原理給出的就是圖像分割中的Otsu方法。

凡此種種都說明,即使是不同的學(xué)科,使用的數(shù)學(xué)基礎(chǔ)也有著千絲萬縷的聯(lián)系,將基本的數(shù)學(xué)概念和充分的想象力結(jié)合起來,觸類旁通就變得輕而易舉。

總結(jié)起來,我對(duì)數(shù)學(xué)學(xué)習(xí)的幾點(diǎn)拙見是:把握數(shù)學(xué)的工具屬性,學(xué)習(xí)具體方法時(shí)先溯因再求果,勤于思考解決相同問題的不同方法,與解決不同問題的相同方法之間的聯(lián)系與區(qū)別。希望這幾條建議能夠在數(shù)學(xué)的學(xué)習(xí)中助你一臂之力。

出處:極客時(shí)間《程序員的數(shù)學(xué)基礎(chǔ)課》

綜合三位老師的觀點(diǎn),其中的共性就是:學(xué)習(xí)數(shù)學(xué),“實(shí)用”優(yōu)先。因此,我繪制了一張“程序員的數(shù)學(xué)應(yīng)用地圖”,包含四個(gè)部分:數(shù)據(jù)結(jié)構(gòu)、編程語句、通用算法和機(jī)器學(xué)習(xí)算法。

數(shù)據(jù)結(jié)構(gòu)和編程語句,你肯定非常熟悉,這些基礎(chǔ)的內(nèi)容涵蓋的數(shù)學(xué)思維毋庸置疑。例如,數(shù)組和鏈表就體現(xiàn)了迭代和遞歸的思想,判斷語句使用了邏輯(布爾)代數(shù)。

架構(gòu)在數(shù)據(jù)結(jié)構(gòu)和編程語言之上的算法(為了將這些算法和機(jī)器學(xué)習(xí)的算法區(qū)分開,我稱其為通用算法),除了迭代和遞歸,也體現(xiàn)了排列、組合和動(dòng)態(tài)規(guī)劃等思想。

對(duì)于機(jī)器學(xué)習(xí)的算法,我們更需要理解概率統(tǒng)計(jì)和線性代數(shù)的核心思想,包括什么是概率、貝葉斯定理、數(shù)據(jù)的統(tǒng)計(jì)分布、向量、矩陣、線性方程等。

在繪制這張應(yīng)用地圖的時(shí)候,我特意反其道而行,從計(jì)算機(jī)編程的角度出發(fā),為你展示程序員應(yīng)該如何看待編程中的數(shù)學(xué)知識(shí)。

我有充足的信心,通過加深對(duì)數(shù)學(xué)的理解,你在分析問題時(shí)就可以追本溯源,快、準(zhǔn)、穩(wěn)地找到解決方案。這樣,今后在面對(duì)系統(tǒng)框架設(shè)計(jì)、性能優(yōu)化、準(zhǔn)確率提升等難題時(shí),你就會(huì)從更高更廣的角度出發(fā)思考問題,而不只是以“熟練工”的視角增刪改查。

來源 | 極客時(shí)間《程序員的數(shù)學(xué)基礎(chǔ)課》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容