數學與軟體工程那些令人驚訝的相似性

OReillyData發表於2016-11-21

在我讀研究生第一年,我對於數學有了一次頓悟,這改變了我對整個機器學習領域的看法與思路。當時我選擇研究的方向是機器學習。這是一個交叉學科的領域,結合了電腦科學、統計學和其他很多的數學學科,比如優化方法和線性代數。需要學的內容非常多,所有的研一的學生都在努力地消化吸收這些海量的概念。

一天晚上,我坐在辦公室裡試圖去對線性代數有所悟。雖然我有一本很好的教材—基爾伯特·斯特朗所著的《線性代數入門》—作為我的引導,但我一直沒辦法取得進展。我看著各種各樣的定義,特徵分解、喬丹正規型、矩陣翻轉等等,就在想:“為什麼?為什麼這些都看著那麼詭異?為什麼翻轉要這麼定義?真正地仔細想想,為什麼所有這些矩陣運算都用現在這個方式來定義?”

就在我無望地盯著滿屏的數學符號的時候,突然腦海裡一道靈光閃現。我意識到:數學是一種設計!在此之前,我一直把數學當成一種宇宙真理一樣的學習。它完美超然、且幾乎凡人所不可知。但在那夜之後,我意識到數學也僅僅是一個人類建立的工具。數學是被設計出來的,就像軟體程式設計是被設計出來的一樣,也使用了很多類似的設計原理。這些原理也許不那麼明顯,但都是可以被理解的。從那個時刻起,對我而言數學從不可知變為合理

數學是由物件、運算以及一些簡化形式構成的系統。它被設計來對真實世界的現象進行建模。與所有的設計類似,它也有一定的自由度。這一系統可以這樣設計,當然也可以那樣設計。一個矩陣在極座標體系裡可以被設計為一個圓球。只要運算是一致的,這種設計就沒有關係;它僅僅就是一個簡化的縮寫。在某個時間點,某個人制定了這些設計。他們挑選了這些物件與運算方式,並指定了組織在一起的規則。如果設計得比較好,那麼基於這些基本的決定,很多有用的、可被證明的特性就出現了。這整套系統就可以被用來對我們所處於的這個世界進行建模:比如拋物在空間裡的執行方式,聲波穿過以太的方式,或者股票價格的漲跌。現實世界包含了層層堆疊的複雜性。設計良好的數學系統則給出了乾淨簡潔的工具來表徵每一層的現實世界。

線性代數被設計來表徵線性方程體系。而線性方程則被設計來表徵線性關係,即一個物件被寫成其他物件相乘的和的關係。線上性代數的縮寫裡,一個線性關係被表徵為一個線性運算元,即一個矩陣。線性運算元被設計得很簡單,因此他們的效應就可以被完全的分析。線性運算元可以做兩件事:旋轉和增縮。這裡,在幾何與代數的交界處,一些神奇的事情發生了。代數裡的乘和加運算被轉化成了向量空間裡的向量的旋轉和增縮。這樣就可以讓我們用代數的方法來分析線性運算元的幾何效應,即把矩陣分解成它的組成部分:需要旋轉多少、需要擴充套件或是壓縮多少以及在哪個方向上進行。

640?wx_fmt=png

來源:Alice Zheng授權使用

數學所包含的某些設計原則也展現在軟體工程裡面。以抽象代數為例,抽象代數本質上就是一個物件層級設計的實踐。它的目的是用近可能少的原料,並一次加入一個或幾個原料,來檢視會得到什麼有趣和有用的產出。一個“群”被定義成一些元素與一個運算的集合(運算必須要滿足一定的條件來保證它的行為不會太奇怪)。一個“環”則是一種特殊的群,它具有兩種可以被泛化成加與乘的運算。一個“域”則是一種特殊的環,它具有四種運算(可以被泛化成加、減、乘、除)。這種定義立刻就聽著像是軟體工程裡的概念:這是一個物件的層級結構,“域”繼承自“環”,而“環”則繼承自“群”!

640?wx_fmt=png

來源:Alice Zheng授權使用

現在讓我們看看實數系統。這是另外一個層級化物件設計的例子,但細節上有一些有趣的變化。讓我們從自然數開始。其實自然數就是我們用手指頭數數的擴充套件。接著,讓我們以零點為中心加入自然數的映象——負數。這樣我們就獲得了整數的概念。再把整數結合上加法和乘法運算,我們就得到了一個上面所說的“環”。如果再結合上乘法和除法,我們就生成了有理數,也就是得到了一個“域”。如果故事就此為止,我們會有一個不錯的結果:我們有一堆數和一些運算。對這些數運用我們的運算,我們還是會得到同樣型別的數。好耶!但不幸的是,我們的幾何學家鄰居會來敲門,並問:“圓形的面積是什麼樣的數?直角三角形的斜邊長度是什麼數?”這些數看起來並不是某兩個整數的比例值。

640?wx_fmt=png

來源:Alice Zheng授權使用

上述的這些發現開啟了無理數的洩洪閘,攪亂了我們設計的乾淨整齊的數的系統。有理數和無理數都是有用的數,因此最好能有一個表達方式來統一處理兩者。但是,源於那個煩人的“無窮”的概念,這兩種數是如此的不同。無理數是無限長的,因此很不容易處理;而有理數是有順序的,且可數的;無理數是無法數的。我們整整花了幾千年來找到一個解決方法去統一處理有理數和無理數。現在最佳的提議是用有限小數方式表示:每個實數都可以被認為是無窮數列的等價類。整個數的系統的結構都是層級化的,而且大部分的元素實際上都沒辦法被有窮圖靈機計算。到頭來,我們可說實數其實完全不“真實”存在,它們都是被構造出來的。

上述這些只是實際在用的數學設計的一小部分例子。我們的文化在灌輸一個很奇怪的理念,即數學是很難的,數學看起來是太抽象、太難學、太難理解,所以幾乎無法學會。但換個角度來看,數學和軟體工程有著令人驚訝的相似性。這兩個學科都會使用自己的行話與表示法。但一旦我們理解了這些行話後,我們就可以看到數學的靈與肉了。理解數學的設計原則可以引領我們進入這個充滿層級物件和變換表現的世界。在對於數學有更多的瞭解後,就可能幫助我們產生更多的數學與軟體工程學交叉的想法。甚至我們也能開始去對數學的設計做修改,產生新的數學設計。想想,現在的實數系統已經非常得古老和笨拙了。是時候來點新的東西了!

Alice Zheng

Alice是機器學習領域的技術帶頭人。她有著豐富的演算法與應用平臺的開發應用經驗。現在她是亞馬遜廣告平臺的高階經理。在此之前,她曾擔任過GraphLab、Dato和Turi的資料科學主管,微軟實驗室的機器學習研究員,卡耐基梅大學的博士後。她擁有加州大學伯克利分校的數學計算機學士學位和電子工程博士學位。

640?wx_fmt=png

相關文章