在開篇,我詳細講了程序員為什么需要學數學。那么,怎樣的學習方法才是行之有效的呢?我想你現在心里還沒有一個固定的答案,而我不想一味地去講我自己的一家之言,畢竟沒有什么學習方法是最好的。
你能做的是要多看,去找適合自己的。而我能做的,就是盡量給你更多的參考,讓你可以自己來選擇。所以,我邀請了幾位朋友,讓他們來談一談,自己學習數學的一些心得體會,希望對你有所啟發。
程序員是否需要學好數學?原本學數學分析、概率論、線性代數的時候,我也沒想到數學和寫程序有啥關系,但是隨著研究的開源軟件越來越多,我發現很多技術深入下去,本質就是數學。
程序員應該怎么學習數學呢?我不建議你將大學的數學書拿出來啃一遍,一來耗費大量時間,二來和實際應用結合不起來,往往該看的忽略了,不該看的費了半天勁用不上,過一陣又忘了。
我們了解一個新技術有三個階段,第一階段是,怎么使用;第二階段是,如何實現,原理是什么;第三階段是,為什么這樣實現。學數學和學一門新技術一樣,也有這樣三個階段,先用起來,了解原理,然后了解為什么。
用一句話來說,我們不能為了數學而學數學,學數學要和具體的應用結合在一起。
隨著過去幾年深度學習成為程序員界的顯學,不少程序員開始回頭復習微積分、概率論和線性代數這樣的基礎數學課,乃至開始學習最優化、博弈論這樣的應用數學課。我自己則是因為從 2010 年一頭扎入了計算廣告的大坑之后,重新開始學習數學。
可以說,這次重新學習數學,為我自己推開了程序世界中另一扇門,使得我在埋頭具體寫代碼之外,有機會重新從另一個角度,去認識和理解“程序”和“問題的解決方案”這兩件事情。
我為什么要學點數學?
投入時間學習數學,于我來說主要是兩個原因,一來,數學在工作中用得上;二來,學點數學很多時候是個有趣的事。
譬如說,過去幾年火起來的深度學習,以及之前沒那么火,但是實際上早早就在搜索、廣告這些領域,應用的機器學習和推薦算法。這里面其實就是結合了微積分、線性代數、概率論之后的最優化問題。
事實上,大部分應用領域的核心解決方案,都是把應用領域的問題,形式化為一個個數學問題。在找到數學問題的“解法”之后,用寫程序的方式翻譯成實際應用的“算法”。而能夠應用“數學”的方式來解決問題,是從一個只能套用現成方案的“碼農”,向能夠將新問題形式化、并找出創新解決方案的“研發工程師”邁出的第一步。
很多問題當你知道如何用數學來解決的時候,常常會有醍醐灌頂的感覺。譬如當我第一次搞明白,廣告中的競價問題,居然能夠變成一個博弈論中“尋找上策均衡”的問題,并且能夠通過簡簡單單的公式表示出來的時候,我是很有滿足感的。
此外,一旦熟悉了機器學習中用到的數學知識,很多想要解決的系統問題,都能通過定義更好的數學優化目標,變成一個能夠找到最優解的程序算法,最后通過寫個程序,翻譯成數學問題來解決,這個過程帶給我巨大的身心愉悅。
我是如何學數學的?
數學整個領域很大,如果想要學點什么,我建議從工作相關的領域開始,先廣度,再深度。
從工作相關的領域開始,是讓自己一是能有實際用得上學到的知識的機會,二是日常工作中容易耳濡目染,相當于常常在復習。而先有廣度,是讓自己在心中有一個問題到解決方法的“地圖”,遇到具體的問題能夠對得上,容易獲得正反饋;然后再有深度,具體去對一個特定的主題學習應用。
當開始深入學一個特定問題的時候,最好的方式是,追一門在線課程,譬如 Coursera、TEDx,或者在極客時間上找一門課程來學習。
這是因為,在線課程有明確的節奏,通常還會提供作業和測驗。通過作業和測驗,讓自己對自己的學習有一個聯系和反饋的過程。即使實踐中沒有足夠的應用,過一段時間有些知識沒有那么熟悉了,但是也容易建立自己很快可以“撿”回來的信心,降低“復習”的啟動成本。跟隨在線課程的節奏,可以有效避免“三天打漁兩天曬網”的惡習,讓學習有始有終。
最后,給你介紹一個有程序員特色的學習方法,針對學習的內容寫一點程序。把正在學習的問題的解法,寫一個算法實現出來。這是一個非常有效的練習方式。譬如學習線性代數,理解仿射,反復讀書的效率對我來說,就不如找來 Coding The Matrix,通過寫程序,讓學習、理解變得更深入。
在數學的學習中,首要的問題是明確需求。作為非數學專業出身的“外行”,我們使用數學的目的不是頂天,而是立地;不是上下求索艱深的理論問題,而是將生活中的具體問題抽象化,進而加以解決。
因此,對于我們這些票友來說,學習數學的基礎在于經驗而非哲學,比較實際的思路是秉持功利主義的原則,用多少學多少。掌握基本的線性代數與矩陣論、概率論與數理統計知識足以應付日常的使用,盲目地好高騖遠通常有害無益。理論化和公理化這些比較深邃的嘗試固然讓人著迷,但它們可能并沒有肉眼可見的實用性,對于絕大部分計算機從業者恐怕過于陽春白雪。
其次,在學習時還要理解數學的本質。數學是工具而非問題,是手段而非目的。探索世界奧秘的學科是“格物窮理”的物理學,相形之下,數學更像是個任人打扮的小姑娘,它存在的意義就是通過合理的設計簡化物理學的研究。
正因如此,在數學中存在著各種各樣在現實中不可能出現的理想化模型(比如無窮小和極限的誕生),也存在著對同一個物理過程不同的建模方式(比如矩陣力學和波動力學)。充分理解數學的人造特質,可以在學習中少走很多無謂的彎路。
理解數學的工具屬性就會自然而然地引出了數學學習中的另一個關鍵點,那就是工具設計的出發點,也就是所謂的數學思想與數學邏輯。
任何一個工具都不是平白無故地設計出來的,它必然要解決某個特定的問題,比如線性代數與矩陣論是對具體對象的抽象表示與運算,比如概率論和數理統計是對不確定性及其定型定量表示的建模。因此,在掌握每一種數學工具的微觀技巧之前,理解它們的宏觀目標是更加重要的。只有掌握了工具誕生的背景與目的,才有可能有效地使用它們。
在這里還要多說一句,數學絕不僅僅是算術,把主要精力放在計算上未免因小失大。在經典科幻《銀河系漫游指南》中,超級計算機告訴人們,世界的終極答案是“42”——這更像是對數字主義者善意嘲諷的一個梗。但對算術的過度強調并不鮮見,在相當數量的現行數學教材中,講解線性代數時開篇便給出行列式的計算方法,這種編排著實讓人費解。
具體到數學每個子學科的學習方法上,相關的經驗教訓已然汗牛充棟,很多內容都無需在此贅言。但在我看來,學習時值得突出強調的一點是舉一反三的能力。同一種工具及其背后的思想可以出現在不同的場景下,解決不同的問題,但是一旦深入到本質層面,就會發現它們實際上是相通的。如何透過現象看本質,將不同場景融會貫通,才是值得鍛煉的高級能力。
同一個工具存在不同應用的例子不勝枚舉:
凡此種種都說明,即使是不同的學科,使用的數學基礎也有著千絲萬縷的聯系,將基本的數學概念和充分的想象力結合起來,觸類旁通就變得輕而易舉。
總結起來,我對數學學習的幾點拙見是:把握數學的工具屬性,學習具體方法時先溯因再求果,勤于思考解決相同問題的不同方法,與解決不同問題的相同方法之間的聯系與區別。希望這幾條建議能夠在數學的學習中助你一臂之力。
好了,三位老師都分享完了自己的學習方法。其實他們有一個共同的觀點,那就是數學要是“實用”的,這和我的想法如出一轍。
首先我們來看最常用的數據結構和編程語句,我想你對它們應該非常熟悉。在我眼里,這些基礎的內容,同樣富含了數學思維。例如,數組和鏈表就體現了迭代和遞歸的思想,判斷語句就是使用了邏輯(布爾)代數。
對于架構在這些數據結構和編程語句之上的算法(為了將這些算法和機器學習的算法區分,我稱其為通用算法),除了迭代和遞歸,也體現了排列、組合和動態規劃等思想。
對于機器學習的算法而言,我們更需要理解概率統計和線性代數的核心思想,包括什么是概率、貝葉斯定理、數據的統計分布、向量、矩陣、線性方程等等。
整個專欄我基本上都是從數學的角度出發,逐步推進到這些知識在計算機中的應用。不過在繪制這張應用地圖的時候,我特意反其道而行之,從計算機編程的角度出發,為你展示程序員應該如何看待編程中的數學知識。
我覺得在開始學習之前,這個地圖會給你一個大體的認識,告訴你計算機領域常用的數學思想有哪些。這時,你也許會產生一些疑惑,同時你可以帶著自己的思考和問題去逐篇學習。等你學完整個專欄之后,再回頭來看看這個地圖,應該會有更深的感觸。我希望這種雙向打通,能夠進一步加強你的學習體驗。
-
程序員
+關注
關注
4文章
954瀏覽量
30321
發布評論請先 登錄
學硬件好還是學軟件好?
阿里云升級通義靈碼AI程序員,全面上線
機械革命發布CODE AI程序員本
傅里葉變換的數學原理
AI編程工具會不會搶程序員飯碗
什么是光子學?
第五屆長沙·中國1024程序員節開幕
程序員節視頻創意大賽,用串口屏贏取千元大獎

程序員節視頻創意盛宴,邀您共襄盛舉!

評論