讀《數學之美》有感

可是真正作好一件事沒有捷徑,須要一萬小時的專業訓練和努力。 ———— 《數學之美》

<1>關於搜索引擎

1.搜索引擎的組成


在《數學之美》中,吳軍博士把搜索引擎的關鍵提煉成了3個方面:
算法

1.下載 ———— 經過網路爬蟲實現 。搜素引擎的網絡爬蟲問題應該定義成「如何在有限的時間內最多地爬下最重要的網頁」。首先,各個網站中最重要的網頁確定是首頁,因此在這個前提下,廣度搜索(BFS)明顯優於深度搜索(DFS)。而實際的網絡爬蟲都是由成千上萬的服務器組成的,對於一個網站,須要一次性把這個網站的內容都下載下來,而不是先下載5%,而後到第二輪再繼續下來,因此這個就有點相似於(DFS)。這個的緣由和爬蟲的分佈式結構以及網絡通訊的握手成功成本有關。同時,爬蟲對網頁遍歷的次序不是簡單的BFS或者DFS,因此就須要一個相對複雜的下載優先級排序的方法,這個管理優先級的子系統通常成爲調度系統服務器

2.索引 ———— 搜索引擎能在極短的時間內找到成千上萬的搜索結果,是經過索引的方法來實現的。最簡單的索引 就是對於一個肯定的關鍵字,用01來表示一篇文章或者一個網頁是否含有這個關鍵字,可是這樣有多少個網頁或者多少篇文章,這個二進制數就有多少位。雖然計算機處理二進制數的速度很快,可是因爲這個索引十分龐大,這就須要把索引分紅不少份,分別存儲在不一樣的服務器中。沒當接受一個查詢的時候,這個查詢就被分發到這些不一樣的服務器上,並行的處理請求,而後再把結果發送到主服務器中進行合併處理,最後返回給用戶。網絡

3.排序 ————PageRank算法 。Google的PageRanke算法由佩奇和布林發明。這個算法的思想 在於民主表決,Y的網頁排名pagerank來源於指向這個網頁的全部網頁X一、X2...Xk的權重之和。其中佩奇認爲,X一、X2...Xk的權重分別是多少,這個取決去這些網頁自己的排名。可是這就成爲了一個先有雞,仍是先有蛋的問題。而解決這個問題的是布林,他把這個問題變成了一個二維矩陣相乘的問題,而且用迭代的方法解決了這個問題。他們先假定全部網頁的排名都是同樣的,而且根據這個初始值進行不斷的迭代。從理論上證實,不管初始值如何選取,這種算法都保證了網頁排名的估計值能收斂到排名的真實值,並且這個排名是沒有任何人工干預的。在理論上,這個二維矩陣的元素有網頁數量的平方那麼多,計算量是很是龐大的,而佩奇和布林利用稀疏矩陣計算的技巧,大大簡化了計算量,實現了這個網頁排名算法。計算量仍然十分龐大,因此Google的工程師發明了MapReduce這個並行計算工具,使得PageRank的並行計算徹底自動化。框架

2.搜索技術——有限狀態機


在《數學之美》中還提到了本地搜索的最基本技術——有限狀態機
舉一個例子就是要搜索一個地址,這就須要判斷一個地址的正確性,同時很是準確地提煉出相應的地理信息(省、市、街道等)。這就就須要一個有限狀態機來完成,有限狀態機是一個特殊的有向圖,有一個開始狀態和一個終止狀態,就好比開始是「XX省」,而後一個箭頭既能夠指向「XX市」,也能夠指向「XX縣」,可是不能是從「XX市」指向「XX省」,這裏面具體的實現算法書中也並無提到。
機器學習

3.搜索中的最短路徑問題


在這以後還提到了一個就是全球導航和動態規劃(Dynamic Programming)的問題。就是要找出兩個點之間的最短距離問題。固然這個最短距離是帶有權重的,好比說花費的時間,消耗的金錢等等。
分佈式

舉一個例子就是從北京到廣州的最短路徑,這時候能夠把北京—>廣州的最短路徑拆成從北京—>石家莊石家莊—>廣州這兩條路徑,當這兩條路徑都是最短的時候,總體的路徑就都是最短的。可是可能會有疑問就是北京—>廣州的路徑就必定通過石家莊嗎?這個問題能夠變成圖論中的最小割問題(吐槽圖論老師1萬字省略。。。),沒學過的能夠想像一下,把你雙手的五個手指張開,並左右手按手指順序把手指尖碰在一塊兒,這時從你左手臂到右手臂的這條路徑中,確定都會通過大拇指、食指、中指、無名指、小拇指之中的其中一個,都由這五個手指組成的點或者邊就是圖論裏面的最小割集或者最小邊集(比喻不是很恰當)。這時候打個比方,北京到廣州的最短路徑,就確定會通過石家莊、天津、太原、鄭州和武漢這五個城市中的其中一個,而後繼續下去尋找局部的最短路徑,就能夠大大下降最短路徑的計算複雜度。

函數

<2>TF-IDF、聚類問題

1.TF-IDF是什麼


在《數學之美》中提到了如何肯定一個網頁和某個查詢的相關性,而這個搜索關鍵詞權重的科學衡量指標就是TF-IDF(Term-frequency/Inverse Document Frequency),即詞頻/逆文本頻率指數
工具

其中TF指的是關鍵詞的頻率,好比說一個「原子能」的詞在一個共有1000個詞的網頁上出現了2詞,那麼「原子能」的詞頻就是0.002,因此是多個詞組成的關鍵詞,就是把這些關鍵詞的TF相加
其中IDF指的是就是關鍵詞的權重,好比「原子能的應用」中,「原子能」的權重要大於「的」和「應用」的權重,公式爲log(D/Dw),其中D是所有網頁的個數,若是「的」在全部網頁中都出現了的話,那麼「的」的權重就是log(1)=0,這樣就能對於不一樣的關鍵詞有不一樣的權重。
性能

2.新聞分類(聚類問題)和餘弦類似度


除了搜索中評價網頁和某個查詢的相關性中用到TF-IDF,在新聞的分類,或者說聚類問題中,也用到了TF-IDF。把某一則新聞中全部的詞算出的TF-IDF,按它的在詞彙表中出現順序進行排列,就能夠獲得一個向量。好比說詞彙表共有64000個詞,那麼沒有出現的詞的TF-IDF就是0,而這個向量就是這一則新聞的特徵向量(Feature Vector)。這時候,就能夠利用餘弦定理來計算兩則新聞之間的夾角,而這個餘弦的值就是兩則新聞的相關度,即餘弦類似性。越小表示兩則新聞越相關,就越能夠分在一類;若是算出來夾角是90度,那麼就說明這兩則新聞徹底不相關,餘弦公式
學習

3.奇異值(SVD)分解


這樣就能夠根據餘弦類似性的值設定閾值來對新聞進行分類。然而在計算的過程當中,因爲計算量很大,這是須要藉助矩陣論的知識對這些計算量進行優化。在成千上萬的新聞和百萬的詞彙表的計算中(好比說矩陣的每一一行表明詞彙表中的每個詞,矩陣的每一列表明一則新聞),要計算每一列新聞中兩兩之間的餘弦類似度,就要進行奇異值分解(SVD分解),若是有N個詞和M篇文章,這就是一個MN的矩陣,此時M=1000000,N=500000,就是100萬50萬,總共5000億個元素。經過SVD分解,就能把這個大矩陣分解成一個100萬100的矩陣X,一個100100的矩陣B,和一個100*50萬的矩陣Y,這三個矩陣相乘的結果。這三個矩陣的元素共和爲不超過1.5億,計算量和存儲量會大大減少。而這三個分解出來的矩陣也有很是清晰的物理含義,舉個例子:

—————————A矩陣——————————— X矩陣 ————— B矩陣 —————— Y矩陣

其中X矩陣的每一行表示一個詞,每一列表示一個語義相近的詞類
其中B矩陣表示詞的類和文章的類之間的相關性
其中Y矩陣是對文本的分類結果,每一行對應一個主題,每一列對應一個文本

4.類似哈希和信息指紋


固然餘弦類似度還能夠用於對比信息指紋的重複性,《數學之美》中還提到了類似哈希這個特殊的信息指紋,具體的計算方法能夠去看《數學之美》P150頁。
類似哈希的特色就是,若是兩個網頁的類似哈希相差越小,這兩個網頁的類似性越高;若是兩個網頁相同,則類似哈希確定相同;若是少數權重小的詞不一樣,其他的都相同,類似哈希也會幾乎相同。之因此看到類似哈希會有印象,也是因爲上次參加的某個算法比賽中對做弊的代碼進行篩選的時候,主辦方就用的類似哈希這個評價標準,因此對於常見的跨語言做弊、替換變量名做弊的方法都能進行有效的識別。

5.K-mean算法


《數學之美》中提到聚類問題的時候,還提到了指望最大化算法,也就是K-means算法

K-means算法是隨機地挑出出一些類的中心,而後來優化這些中心,使得它們和真實的聚類中心儘量一致。假設有N篇文章,咱們想把它們分紅K類,這時咱們能夠不知道K具體是多少,最終分紅多少類就分紅多少類。

K-means算法的步驟是:
1.隨機挑選K個點做爲起始的中心;
2.計算全部點到這些聚類中心的距離(使用歐幾里德公式),將這些點歸到最近的一類中;
3.從新計算每一類的中心;
4.迭代,最終偏移很是小的時候獲得收斂。
這一類算法的過程當中,根據現有的模型,計算各個觀測數據輸入到模型中的計算結果,這個過程成爲指望值計算過程,即E過程;接下來,從新計算模型參數,以最大化指望值,這一過程稱爲最大化的成果,即M過程。這一類算法都稱爲EM算法

<3>關於最大熵原理


最大熵原理指出,須要對一個隨機事件的機率分佈進行預測的時候,咱們的預測應當知足所有已知的條件,而對未知的狀況不要作任何的主觀假設。在這種狀況下,機率分佈最均勻,預測的風險最小。由於這時機率分佈的信息熵最大,因此人們稱這種模型叫作「最大熵模型」。即「不要把全部的雞蛋放在一個籃子裏」,由於當咱們遇到不肯定性的時候,就要保留各類可能性。

<4>關於機器學習和天然語言處理

1.圖靈和人工智能


機器學習(Machine Learning)是一門專門研究計算機怎樣模擬或者實現人類的學習,以獲取新的知識或技能,從新組織已有的知識結構使之不斷改善自身的性能的學科。而最先提出機器智能設想的是計算機科學之父—————阿蘭·圖靈(Alan Turing)。他在1950年的《思想》雜誌上發表了一篇題爲「計算的機器和智能」的論文中,提出了一種驗證機器是否有智能的方法:讓人和機器進行交流,若是人沒法判斷本身交流的對象是人仍是機器的時候,就說明這個機器有了智能。後來這種方法被成爲圖靈測試(Turning Test)

2.天然語言處理的歷史


而在天然語言的機器處理(天然語言處理)的歷史中,能夠分紅兩個階段:

1.一個是20世紀50年代到70年代,也就是從大約1950-1970的這段時間,全世界的科學家對計算機處理天然語言的認識都被本身侷限在人類學習語言的方式上,就是用計算機模擬人腦。後面吳軍博士提到了這段時間對天然語言處理的研究主要是基於規則的方式,想讓計算機完成翻譯或者語音識別這樣只有人類才能完成的事情,就必須先讓計算機理解天然語言,即讓計算機有相似人類這樣的智能。好比學習語言的過程當中要學習語法規則,詞性和構詞法等等,而這些規則有很容易用算法來描述,因此在當時你們對基於規則的天然語言處理頗有信心。可是實際上,當用算法來描述這些規則的時候,所造成的語法分析樹十分的複雜,並且規則的數量衆多,耗時且有時會互相矛盾。因此在20世紀70時代,基於規則的句法分析走到了盡頭,也使得這段時間的成果近乎爲零。

2.另外一個階段是20世紀70年代後,一些先驅認識到基於數學模型和統計的方法纔是正確的道路,因此天然語言處理進入了第二個階段。這種方式的思想在於統計,即大多數樣本怎麼作
舉個例子就是:pen有兩個意思,一個意思是鋼筆,而另外一個意思是圍欄。對於兩個句子「The pen is in the box.」和「The box is in the pen.」來講,正確的翻譯應該是「鋼筆在盒子裏。」和「盒子在圍欄裏。」,由於正常來講,盒子是不可能在鋼筆裏的。

在20世紀70年代,給予統計的方法的核心模型是通訊系統加隱含馬爾可夫模型。這個系統的輸入和輸出都是一維的符號序列,並且保持原有的次序。最高得到成功的是語音識別是如此,後來第二個得到成功的此詞性分析也是如此。而在句法分析中,輸入的是一維的句子,輸出的是二維的分析樹;在機器翻譯中,雖然輸出的依然是一維的句子,可是次序會有很大的變化,因此上述的方法就不太管用了。1988年,IBM的彼得·布朗(Peter Brown)等人提出了基於統計的機器翻譯方法,框架是正確的,可是因爲缺少足夠的統計數據和沒有足夠強大的模型來解決不一樣語言語序顛倒的問題,因此實際的效果不好,後來這些人去了文藝復興公司發財去了。而只有出現了基於有向圖的統計模型才能很好的解決複雜的句法分析這個問題。

<5>提到的計算機領域的科學家


1.阿蘭·圖靈(Alan Turing)————計算機科學之父
2.約翰·麥卡錫(John McCarthy)————圖靈獎得到者,發明Lisp語言,斯坦福大學人工智能實驗室的主任
3.馬文·明斯基(Marvin Minsky)————圖靈獎得到者,建立麻省理工學院(MIT)人工智能實驗室
4.納撒尼爾·羅切斯特(Nathaniel Rochester)————IBM的傑出計算機設計師
以上四人於1956年在達特茅斯學院舉辦的夏季人工智能研討會是計算機科學史上的一座里程碑,參加會議的包括下面兩位,總共10人。討論了當時計算機科學還沒有解決的問題,包括人工智能、天然語言處理和神經網絡等。
5.赫伯特·西蒙(Herbert Simon)————圖靈獎得到者,同時仍是美國管理學家和社會科學家,經濟組織決策管理大師,第十屆諾貝爾經濟學獎獲獎者
6.艾倫·紐維爾(Allen Newell)————圖靈獎得到者
7.高德納·克努特(Donald Knuth)————圖靈獎得到者,算法和程序設計技術的先驅者,計算機排版系統TEX和METAFONT的發明者,提出用計算複雜度來衡量算法的耗時
8.弗裏德里克·賈里尼克(Frederick Jelinek)————領導IBM華生實驗室,提出採用統計的方法解決語音識別問題
9.米奇·馬庫斯(Mitch Marcus)————設立和領導了LDC項目,採集和整理全世界主要語言的語料(其中著名的是Penn Tree Bank),並培養了一批世界級的科學家

<6>統計語言模型


計算機處理天然預言,一個基本的問題就是爲天然語言這種上下文相關的特性創建數學模型。這個數學模型就是在天然語言處理中常說的統計語言模型

1.怎樣求一個句子S合理的可能性


賈里尼克的思想就是:認爲一個句子是否合理,就是看它的可能性大小如何。
假定S表示某一個有意義的句子,由一連串特定順序排列的詞w一、w2...wn組成,這裏n是句子的長度。其中S出現機率是:

2.一個句子S合理的可能性和句中每一個詞都有關


利用條件機率公式

得:

其中,P(w1)是第一個詞出現的機率,P(w2|w1)是在已知第一個詞的前提下,第二個詞出現的機率,到了第n個詞,這個詞出現的機率和前面全部的詞出現的機率都有關。

3.馬爾可夫假設:後一個出現的機率只和前一個詞有關(條件機率)


計算第一個詞出現的機率很簡單,即P(w1),第二個詞的條件機率P(w2|w1)非常能夠計算的,可是越到後面,計算量就愈來愈大。到了19世紀至20世紀初的這段時間,俄羅斯有一個數學家——馬爾可夫(Andrey Markov)就提出了方法,就是遇到這種狀況,就假設任意一個詞Wi出現的機率只和前面一個詞Wi-1有關。這種假設在數學上成爲馬爾可夫假設。這下公式變成:

以上這個公式對應了統計語言模型中的二元模型(Bigram Model)

4.如何計算條件機率——分別計算聯合機率和邊緣機率


接下來的問題變成了如何計算條件機率

當要計算聯合機率P(Wi-1,Wi)邊緣機率P(Wi-1)的時候,須要大量的機讀文本,也就是語料庫。其中
是Wi-1,Wi這個二元詞組在整個語料庫中先後相鄰出現的次數,而 是Wi-1這個詞在整個語料庫中出現的次數,這兩個比值成爲這個二元詞組或者詞的相對頻度

根據大數定理,當統計量足夠充分的時候,相對頻度就等於機率,即


因此,要計算的條件機率就等於

5.高階模型的計算量


對於高階語言模型,是假定文本中的每一個詞都和前面的N-1個詞有關,而和更前面的詞無關。對於N元模型的空間複雜度,幾乎是N的指數函數O(|V|^N)時間複雜度也是一個指數函數,O(|V|^N-1).因此N的大小決定了空間複雜度和時間複雜度的大小。當N從1到2,從2再到3的時候,模型的效果上升的很明顯,可是從3到4的時候,效果的提高就不是很顯著了。

模型訓練中的問題:
零機率問題——假定要訓練一個漢語的語言模型,漢語的詞彙量大體是20萬這個量級,訓練一個3元模型就須要200000^3 = 8*10^15這麼多的參數,可是因爲訓練數據量不可能達到這麼多,因此若是用直接的比值計算機率,大部分的條件機率依然是零,這種模型咱們稱之爲「不平滑」。對於這種問題,圖靈提出了一種在統計中相信可靠的統計數據,而對不可信的統計數據大折扣的一種機率估計方法,同時將折扣出來的那一小部分機率給予未看見的事件。這個從新估算機率的公式後來被稱爲古德-圖靈估計

<7>隱含馬爾可夫模型

1.已經求出一個句子S出現的機率


當求出了一個句子S出現機率以後:

2.在已知一個英文句子O出現機率的狀況下,求漢語句子S出現機率最大的那個S,即O最有可能被翻譯成S(機器翻譯)


對於一個觀測到的信號o1,o2,……,on來還原發送的信號s1,s2,……,sn,實際的例子能夠是根據收到的英文,求原來漢語的意思,這就是機器翻譯的原理。寫成數學表達式就是求如下公式有最大值時候的那個s1,s2,s3……:

3.利用貝葉斯公式化簡


利用貝葉斯公式,能夠把上述公式轉換成(把條件機率公式用了兩次):

其中P{s1,s2,s3,……|o1,o2,o3,……}表示信息s1,s2,s3,……在傳輸以後變成接收的信號o1,o2,o3,……的可能性;
而P{s1,s2,s3,……}表示s1,s2,s3,……自己是一個在接收端合乎情理的信號的可能性;最後而P{o1,o2,o3,……}表示在發送端產生信息o1,o2,o3,……的可能性(注意s和o在通過了條件機率公式後交換了發送和接收的位置),這時因爲P{o1,o2,o3,……}是一個能夠忽略的常熟,因此上面公式等價於

4.再次利用馬爾可夫假設(轉移機率)


這時,能夠用隱含馬爾可夫模型來解決這個問題:隱含馬爾可夫模型其實並非19世紀俄羅斯數學家馬爾可夫發明的,而是美國數學家鮑姆等人在20世紀六七十年代發表的一系列論文中提出的,隱含馬爾可夫模型的訓練方法(鮑姆-韋爾奇算法)也是以他的名字命名的。隱含馬爾可夫模型之因此是隱含的,是由於它每個時刻的狀態是不可見的。而對於馬爾可夫鏈來講,對於一個隨機時間序列S1,S1,S3,……St中的每個狀態的機率,不僅其自己是隨機的,也就是說它能夠是馬爾可夫鏈中的任何一個狀態,並且它還和前一個狀態有關,這兩點說明了St的機率有兩個維度的不肯定性。在任一時刻t的狀態St是不可見的且是不肯定的,由於這時候只知道輸出的序列Ot,因此觀察者不能經過觀察到s1,s1,s3,……sr來推測轉移機率等參數。可是能夠經過Ot來推測這些參數。
此時根據上節馬爾可夫提出的只和前一個有關的假設:




因此,可得


其中P{s1,s2,s3,……}就是上一節求出的每個句子是否合理的可能性,也就是從收到的英文{O1,O2,O3,……}求原來的漢語{S1,S2,S3,……}的過程當中,這個漢語句子{s1,s2,s3,……}存在的合理性。能夠理解爲「The box is in the pen」被翻譯成「盒子在鋼筆中」和「盒子在圍欄中」這兩個句子哪一個更合理。
P{s1,s2,s3,……|o1,o2,o3,……}根據應用的不一樣而有不一樣的名稱,在語音識別中被成爲「聲學模型」,在機器翻譯中是「翻譯模型」,而在拼寫校訂中是「糾錯模型」。

5.如何求轉移機率和生成機率


此時,問題變成了求轉移機率和生成機率乘積的最大值的問題
1.轉移機率

其中N(St-1)就是在有了足夠多的人工標記的數據後,通過狀態St-1的次數(能夠理解爲在語料庫中某個詞St-1出現的次數),而N(St-1,St)是在通過St-1這個狀態後轉移到St這個狀態的次數(能夠理解爲在語料庫中詞St-1後出現詞St的次數),而這兩個數的比值就是轉移機率P(St|St-1)的值
同理
2.生成機率

其中N(St)就是在有了足夠多的人工標記的數據後,通過狀態St的次數(能夠理解爲在語料庫中某個詞St出現的次數),而N(Ot,St)是在通過Ot這個狀態後轉移到St這個狀態的次數(能夠理解爲在語料庫中英文單詞Ot被翻譯成漢語詞語St的次數),而這兩個數的比值就是生成機率P(Ot|St)的值

6.如何求轉移機率和生成機率乘積的最大值


當求出轉移機率和生成機率以後,就能求出一個已知的英文句子{O1,O2,O3,……}被翻譯成{S1,S2,S3,……}的全部可能性的大小,而後下一步就是要求這全部的可能性中最大的時候的那個{S1,S2,S2,……},這須要用到維特比算法。維特比算法是一個動態規劃算法在求因此可能性中最大的值的時候,也至關於求一個求機率最大的路徑(或者最短路徑)的問題。在已知輸出的英文{O1,O2,O3,……}的狀況下,可能有不少種不一樣的路徑能從而獲得不一樣的中文{S1,S2,S3,……},這些路徑組成了一個成爲籬笆網絡(Lattice)的圖,其中咱們要求的是最可能的,也就是機率最大的那個中文{S1,S2,S3,……}。
舉個例子就是Bush能夠翻譯成布什,也能夠翻譯成灌木叢,可是當Bush的前一個詞是總統的時候,Bush翻譯成布什的機率最大。這時就能夠參考從北京到廣州的最短路徑的問題,使用維特比算法對計算量進行化簡。

有監督的訓練須要大量人工標記的數據,實際上不少應用不可能作到,就翻譯模型的訓練來講,這須要大量的中英文對照的語料,還要把中英文詞語一一對應起來。因此在實際的訓練中經常使用的是無監督的訓練算法,即鮑姆-韋爾奇算法。鮑姆-韋爾奇算法的思想是首先尋找一組可以產生輸出序列O的模型參數,這個模型是必定存在的,由於當轉移機率P和輸出機率Q爲均勻分佈的時候,模型能夠產生任何輸出。而後在這個模型的基礎上算出這個模型產生輸出序列O的機率,並根據這個模型能夠找到一個更好的模型,這個新的模型輸出序列O的機率大於原來的模型。通過了不斷的迭代從而不斷的估計新的模型參數,使得輸出序列O的機率最大化。這個過程被稱爲指望最大化(Expectation-Maximization),簡稱EM過程
具體的方法和公式《數學之美》中並無細說,具體的過程就沒能理解了。


結束,理解有錯誤的話望指出

相關文章
相關標籤/搜索