我們先來看看第一個重點:數(shù)學(xué)的用處都有什么?
我們現(xiàn)在每天都離不開的手機和電腦,其實本質(zhì)上也就是各種計算機,要想讓它們輔助我們的生活工作,就避免不了讓它們處理人類的文字和語言,比如語音文字轉(zhuǎn)換、語言翻譯等等,那你知道計算機處理人類的文字、語言背后的原理是什么嗎?
其實在很早以前,人們就已經(jīng)試著用數(shù)學(xué)來解決文字校驗的問題了。我們知道,猶太人信仰猶太教,猶太教的經(jīng)典是《圣經(jīng)》中的《舊約》,里面記載著猶太人的歷史。可是,《圣經(jīng)》不是由一個人寫成的,它的寫作過程經(jīng)歷了好幾個世紀,所以之后的作者在補充《圣經(jīng)》時,就會面臨一個問題,那就是怎么在抄寫的過程中不出現(xiàn)錯誤?人的馬虎總是難以避免,所以這本應(yīng)該是一個難題。
但是聰明的猶太人發(fā)明了一種方法。他們在抄寫《圣經(jīng)》時,會把每一個希伯來字母對應(yīng)一個數(shù)字,這樣,每行或者每列文字加起來都對應(yīng)一個數(shù),這個數(shù)就是這一行或這一列的校驗碼。這樣一來,抄完之后只要對比每行每列的校驗碼正不正確就行了,如果發(fā)現(xiàn)校驗碼有錯,那通過行和列的校驗碼,也可以很快地定位到抄錯的地方。這背后的原理,和我們今天的各種校驗也是相同的。
那人類的自然語言該怎么處理呢?在這個問題上,人們曾經(jīng)走過很多彎路。其實最開始的時候,科學(xué)家們按照仿生學(xué)的思路,堅持認為,要讓計算機學(xué)會處理自然語言,就必須像人一樣,先讓它理解自然語言,讓它學(xué)會語法。但是后來人們發(fā)現(xiàn),語法規(guī)則實在太多,根本沒有辦法窮盡。因為我們?nèi)粘S玫淖匀徽Z言其實很復(fù)雜,不同的語境,不同的上下文,不同的語序,都會產(chǎn)生完全不同的語義。根據(jù)計算,就算覆蓋我們平時常用語言的20%,都要寫幾萬條語法,這個工作量就已經(jīng)是天文數(shù)字了。而且寫到后面,還會有自相矛盾的語法,為了區(qū)分,還要注明什么環(huán)境下用什么語法,整個過程無比繁瑣。所以讓計算機學(xué)習(xí)語法這一條路,在上個世紀70年代就走到了盡頭。
就在人們一籌莫展的時候,數(shù)學(xué)的威力顯示了出來。數(shù)學(xué)的魅力就在于讓復(fù)雜的問題簡單化。美國著名的計算機科學(xué)家賈里尼克領(lǐng)導(dǎo)他的實驗室,借助數(shù)學(xué)中的統(tǒng)計學(xué)工具,把當時語言識別的成功率從70%提升到90%,同時讓語言識別的規(guī)模,從幾千個單詞上升到幾萬個單詞,讓語言識別有了實際應(yīng)用的可能。聽到這兒你可能很疑惑,統(tǒng)計學(xué)和自然語言好像沒什么關(guān)系,它怎么處理自然語言呢?其實賈里尼克的思路很簡單,他認為,要判斷一個句子正不正確,就要看這個句子出現(xiàn)的可能性的大小,這個可能性用概率來衡量。比如,我們假定第一個句子出現(xiàn)的概率是二分之一,第二個句子出現(xiàn)的概率是千分之一,那第一個句子出現(xiàn)的可能性就比第二個句子大得多,那么從概率的角度來說,第一個句子就更有可能是正確的。
所以接下來我們需要做的事,就是判斷一個句子出現(xiàn)的可能性有多大。這時就需要用到“馬爾科夫假設(shè)”,這個假設(shè)是說,假定一個句子里每個詞出現(xiàn)的概率,只和前一個詞有關(guān),就好比“漲停”這個詞,最有可能出現(xiàn)在“股票”這個詞之后。那么,只要給計算機量足夠大的機讀文本,也就是專業(yè)人士說的語料庫,計算機就能算出來,在一個特定詞后面出現(xiàn)某個詞的概率。這樣,只要把一句話里所有詞出現(xiàn)的概率相乘,就是這個句子出現(xiàn)的概率。概率最大的句子,就是最有可能正確的句子。按照這個思路,科學(xué)家們成功地讓計算機擁有了處理自然語言的能力。
你看,一個用幾萬條復(fù)雜語法解決不了的問題,用數(shù)學(xué)工具就輕松地解決了,而且效果還要好得多。那除了自然語言,我們今天用手機、用電腦,最常做的一個動作之一就是“搜索”。很多人喜歡點網(wǎng)站上的分類標簽,看自己特別感興趣的新聞。那計算機是怎么給這些新聞分類的呢?這背后的原理也就是數(shù)學(xué)。這就是我們最開始舉的那個例子:余弦定理能幫助新聞網(wǎng)站進行新聞分類。
余弦定理大家中學(xué)都學(xué)過,你可能忘了,我來跟你復(fù)習(xí)一下啊。它是一個揭示三角形邊角關(guān)系的重要數(shù)學(xué)定理,使用余弦定理,就可以僅憑三角形兩個邊的向量,計算出這兩個邊的夾角。向量就是有特定長度和方向的量,可以表示為帶箭頭的線段。
具體該怎么做呢?一篇新聞里會有很多詞,像“之乎者也的”這種虛詞,對判斷新聞的分類沒有太大的意義。而像“股票”“利息”這種實詞,是判斷新聞分類的重點詞。科學(xué)家精選了一個詞匯表,這里面收錄著64000個詞,每個詞都對應(yīng)一個編號。他們先把大量文字數(shù)據(jù)輸入計算機,算出每個詞出現(xiàn)的次數(shù)。
一般來說,出現(xiàn)次數(shù)越少的詞越有搜索價值,比如“愛因斯坦”“數(shù)學(xué)之美”;而出現(xiàn)次數(shù)越多的詞,越?jīng)]有搜索價值,比如“一個”“這里”等等。根據(jù)這個標準,把詞匯表里的64000個詞都算出各自的權(quán)重,越特殊的詞權(quán)重越大。然后,再往計算機里輸入要分類的新聞,計算出這64000個詞在這篇新聞里的分布,如果某些詞沒有在這篇新聞里出現(xiàn),對應(yīng)的值就是零,如果出現(xiàn),對應(yīng)的值就是這個詞的權(quán)重。這樣,這64000個數(shù),就構(gòu)成了一個64000維的向量,我們就用這個向量來代表這篇新聞,把它叫做這篇新聞的特征向量。
不同類型的新聞,用詞上有不同的特點,比如金融類新聞就經(jīng)常出現(xiàn)“股票”“銀行”這些詞,所以不難判斷,同類新聞的特征向量會有相似性。這樣的話,只要算出不同新聞特征向量之間夾角的大小,就可以判斷出它們是不是同一類新聞。這時就要用到余弦定理,來把兩則新聞的特征向量之間的夾角算出來。科學(xué)家可以人工設(shè)定一個值,只要兩個向量之間的夾角小于這個值,這兩則新聞就可以判定成同一類新聞。你看,一個簡單的數(shù)學(xué)定理,通過科學(xué)家們的巧妙應(yīng)用,再次舉重若輕地解決了一個難題。
來給你總結(jié)一下這部分的內(nèi)容。科學(xué)家們使用了統(tǒng)計學(xué)的方法,用概率的大小判斷一個句子的正確性,從而讓計算機獲得了處理自然語言的能力。而在新聞分類領(lǐng)域里,科學(xué)家們用到了余弦定理,來判斷新聞的特征向量之間的夾角,從而讓計算機能夠確定新聞的類別。
那咱們來回答一下這個部分的問題“數(shù)學(xué)的用處都有什么”。吳軍在書中說技術(shù)分為“道”和“術(shù)”兩種,做事的原理和原則是“道”,而做事的具體方法就是“術(shù)”。我覺得數(shù)學(xué)真正的作用,就是讓我們掌握“道”。因為從歷史的發(fā)展來看,所有的“術(shù)”都會從獨門秘籍到普及再到落伍,就像吳軍說的只有掌握了“道”的人才能永遠游刃有余。
第二部分
說完了數(shù)學(xué)的作用,可能有人還是覺得不太服氣:沒錯,數(shù)學(xué)有時候確實有用,但是人類也不是離不開數(shù)學(xué),我不懂數(shù)學(xué)也可以憑經(jīng)驗來認識世界,來解決問題。有這種觀點的人可能不在少數(shù),但吳軍在書里告訴我們,很多問題光靠經(jīng)驗累積是沒辦法解決的,必須要有數(shù)學(xué)的幫助才能得到答案,這是為什么呢?第二個重點我就給你說說:數(shù)學(xué)為什么這么有用?
和經(jīng)驗相比,數(shù)學(xué)能幫助我們的,就是能讓我們找到一個正確的數(shù)學(xué)模型。這有多重要呢?吳軍說,只有正確的數(shù)學(xué)模型,才能把一個大問題的計算復(fù)雜度降低,讓它變得簡單。而經(jīng)驗給我們的模型,常常是錯的,那由它總結(jié)出來的結(jié)論,也就是錯的。
比如人類從古時候起,就想弄清楚天上星星的運動規(guī)律,因為我們身處地球之上,所以古人們最開始很自然地把地球當成了宇宙的中心。其他的星體,不管是太陽、月亮還是金木水火土這幾大行星,在古人的眼里都在圍繞地球旋轉(zhuǎn)。這種基本認知就是我們今天常說的“地心說”。但是實際上,除了月亮以外,其他所有星體實際上并不是繞著地球轉(zhuǎn)的,所以這些星體的運動規(guī)律,在地球上看來就特別復(fù)雜。如果你讀過《達芬奇密碼》這本書就知道,金星大約每四年,會在天上畫一個五角星。
這個軌跡就太復(fù)雜了,為了給星體找到一個符合觀測經(jīng)驗的運動規(guī)律,古代科學(xué)家們找了很多方法,其中,最有名的來自古羅馬天文學(xué)家托勒密。托勒密為了完善地心說,設(shè)計了一種大圓套小圓的運動方式,極為精確地計算出了所有行星的運動軌跡。不過這個模型相當復(fù)雜,他的這套理論一共用到了40到60個圓形,大圓里面套小圓,你想想,就算今天有了計算機的幫助,我們都很難解出40個套在一起的圓方程。
你看行星的軌跡運行得這么復(fù)雜,就是因為數(shù)學(xué)模型找錯了的原因。托勒密的模型就算再精密,再符合當時人們的經(jīng)驗判斷,也不能說是正確的數(shù)學(xué)模型。后來,波蘭天文學(xué)家哥白尼提出了日心說,德國天文學(xué)家開普勒在他的基礎(chǔ)上,偶然發(fā)現(xiàn),原來行星繞太陽轉(zhuǎn)不需要大圓套小圓,一個橢圓方程就搞定了。他還通過這個數(shù)學(xué)模型,總結(jié)出了行星圍繞恒星運轉(zhuǎn)的開普勒三定律,把星體的運動規(guī)律解釋得清清楚楚。
而且這個正確的數(shù)學(xué)模型,還在后來成功地幫科學(xué)家找到了海王星。當時法國天文學(xué)家布瓦爾發(fā)現(xiàn),天王星的運行軌道和橢圓模型算出來的不太一樣。后來科學(xué)家直接用數(shù)學(xué)工具,計算出了吸引天王星偏離軌道的海王星。你看這種未觀測先發(fā)現(xiàn)的成果,是不可能光憑日常經(jīng)驗得到的。有些由經(jīng)驗帶來的先入為主的觀念,還會嚴重阻礙人們對世界本來面目的認識過程。
其實,歷史對人類在這方面的教訓(xùn)真不少,吳軍還說了一個和我們生活息息相關(guān)的例子。有二十年以上打字經(jīng)歷的朋友可能都知道,原來在電腦上打字可是一個技術(shù)活兒。當時比較流行的輸入法有五筆輸入法、雙拼輸入法、還有全拼輸入法,等等。可是到了今天,使用雙拼和五筆輸入法的人越來越少,而使用全拼的人越來越多,這是為什么呢?
這還是要從人們的固有經(jīng)驗說起。人們一開始總以為,最好的漢字輸入法就是最簡單的輸入法,平均打一個字敲擊的鍵盤次數(shù)越少,那這個輸入法就越好,但歷史又一次證明,這種經(jīng)驗上的直覺并不可靠。比如拼音輸入法中的雙拼和全拼,在雙拼輸入法中,每個聲母和韻母都只用一個鍵表示,而全拼輸入法則要求打出整個拼音。
比如“ao”這個韻母,在雙拼中只需要按“k”這個鍵,而全拼則需要按“a”和“o”兩個鍵。所以雙拼敲擊鍵盤的次數(shù)會天然地比全拼短,看起來更高效一些。但吳軍說,雙拼法看似減少了敲擊鍵盤的次數(shù),但輸入一點也不快。為什么呢?因為漢語的聲母韻母加起來一共有50多個,但是鍵盤上只有26個字母鍵,所以很多韻母就需要共享一個字母鍵,這就會導(dǎo)致,打字的人要從更多的候選漢字里找到自己想打的字;而且雙拼的方法不自然,比全拼多出來一道拆分聲母和韻母的過程,你需要背下來哪個韻母是哪個按鍵;最后,很多南方人分不清前后鼻音和卷平舌音,結(jié)果就導(dǎo)致翻了好幾頁都找不到自己想打的字,其實原因是一開始就打錯了聲母或者韻母。
這一系列問題都證明,追求更簡單高效的雙拼輸入法,實際效率并不高,五筆輸入法也是類似的情況。上世紀90年代時,中國出現(xiàn)的輸入法種類一度多達上千種,但這些輸入法大多和雙拼一樣,都把發(fā)力點放在了減少敲擊次數(shù)上,都強調(diào)自己是最快的。這個方向就走偏了,到了現(xiàn)在,人們幾乎全都拋棄了這些輸入法,這一批發(fā)明人可以說是全軍覆沒。
與此同時,全拼輸入法得到不斷改進。所有漢字全拼的平均長度是2.98,只要能很好地利用上下文的相關(guān)性,就能把全拼輸入法的平均敲擊次數(shù)控制在3次以內(nèi)。那該怎么利用上下文的相關(guān)性呢?這里又有人繞過彎路。10年前,人們就是通過不斷增加詞庫,甚至把一整句唐詩當成一個詞來解決這個問題。但是統(tǒng)計下來發(fā)現(xiàn),幫助不太大。因為漢語里短字詞“一音多字”的情況太多,如果詞庫非常大,打出來的候選詞太多,找到自己想要的那個還是很費時間。吳軍說,增大詞庫,這也是根據(jù)經(jīng)驗和直覺的應(yīng)對方法,就和我們剛剛說的,“在大圓里套小圓,在小圓里套更小的圓”思路一樣。
那最好的解決辦法是什么呢?就是借助語言模型。這和第一個重點里說的,計算機處理自然語言的思路比較像,都是利用統(tǒng)計學(xué)的原理,來計算出一長串拼音轉(zhuǎn)化成文字的最有可能選項,方便使用者直接打出一大段文字。和之前憑經(jīng)驗行動的解決方法相比,這就是更好的數(shù)學(xué)模型。
總結(jié)下這部分的內(nèi)容。在這個重點里,我們討論了“數(shù)學(xué)為什么這么有用”這個問題,答案是數(shù)學(xué)能幫助我們發(fā)現(xiàn)僅憑經(jīng)驗無法發(fā)現(xiàn)的規(guī)律,找到僅憑經(jīng)驗無法總結(jié)出來的辦法。比如發(fā)現(xiàn)行星圍繞恒星運轉(zhuǎn)的事實,比如大幅優(yōu)化全拼輸入法,使之成為最好用的輸入法等等。可以說沒有數(shù)學(xué),我們不可能擁有今天的世界觀和生活方式。
第三部分
我們說完了數(shù)學(xué)的用處,和數(shù)學(xué)有用的原因,接下來讓我們一起回歸這本書的標題,來看看吳軍認為的“數(shù)學(xué)之美”所以第三個重點就是,為什么說數(shù)學(xué)之美就是簡單美?
數(shù)學(xué)公式、數(shù)學(xué)計算、數(shù)學(xué)推導(dǎo)的過程可能實際應(yīng)用起來都很復(fù)雜,這也是為什么數(shù)學(xué)這么難學(xué)的原因。但是數(shù)學(xué)應(yīng)用背后所包含的數(shù)學(xué)思想,卻總是簡單的,這種簡單之美,就是吳軍一直說的數(shù)學(xué)之美。
計算機的原理其實就是一個例子,計算機的術(shù)很復(fù)雜,它一般由大量的精密電路搭建而成,但是計算機的道卻很簡單,它本質(zhì)上的邏輯來自簡單的不能再簡單的布爾代數(shù)。布爾代數(shù)的運算元素只有0和1兩個數(shù)字,基本的運算也只有三種,第一種是“與”,也就是英文AND,第二種“或”,也就是OR,第三種是“非”,也就是NOT很好理解。就是這么簡單的布爾代數(shù),實際上就是數(shù)字電路的基礎(chǔ)。所有的數(shù)學(xué)和邏輯運算,比如加、減、乘、除、乘方、開方,等等,全部都能轉(zhuǎn)化成布爾代數(shù)的基本運算。正是靠這一點,人們才用以布爾代數(shù)原理為基礎(chǔ)的一個個電路,搭建起了現(xiàn)代電子計算機。
再比如,我們剛才介紹的幾個例子,讓計算機處理自然語言,一條路是成千上萬的復(fù)雜語法,另一條路是讓計算機算概率、找規(guī)律,前者科學(xué)家們努力了幾十年但沒什么收獲,后者輕輕松松就讓計算機處理語言文字的能力大幅提高,數(shù)學(xué)思想再次化繁為簡,用簡單的思路解決了復(fù)雜的問題。還有我們每天都要用到的全拼輸入法,在數(shù)學(xué)的幫助下輸入效率大大提高。而雙拼和五筆輸入法雖然符合人們對于快速輸入的直觀認識,但是實際應(yīng)用困難,效率反而不高,缺乏正確的數(shù)學(xué)方法,最終結(jié)果就是被使用者逐漸拋棄。用吳軍的話來說,在現(xiàn)實生活中,真正能夠通用的工具,在形式上一定是簡單的。一架普通的照相機,不應(yīng)該要求它的使用者必須精通光圈和快門速度的設(shè)置。
“簡單之美”說著容易,但其實,連谷歌這樣的大公司都曾經(jīng)犯過“大圓套小圓”的錯誤。吳軍說,他剛到谷歌的時候,發(fā)現(xiàn)一些早期的算法根本沒有系統(tǒng)的模型和理論基礎(chǔ),大部分軟件工程師都是靠直覺來解決問題的。這些錯誤的模型,也許碰巧幾次會有效,就像“地心說”一樣,不是也用了幾千年嗎,但是錯誤的模型一定會漸漸表現(xiàn)出來負面影響。最終不僅會偏離正確的結(jié)果,甚至?xí)押唵蔚氖虑楦銖?fù)雜,最終瀕臨崩潰。
2006年后,谷歌幾乎重寫了所有項目的程序,保證了工程的正確性。但是在其他公司,甚至美國的一些掛著高科技頭銜的二流IT公司,“大圓套小圓”的情況還是很常見。這就像是一個人有了錢,穿金戴銀,但是內(nèi)在的學(xué)問和修養(yǎng)還沒提高。吳軍說他寫這本書,也是希望讀者可以通過對IT規(guī)律的認識,舉一反三地總結(jié)、學(xué)習(xí)和運用自己生活中的規(guī)律性,提升自己的境界。