谷歌的网页排序算法(PageRank Algorithm)
本文將介紹谷歌的網頁排序算法(PageRank Algorithm),以及它如何從250億份網頁中撈到與你的搜索條件匹配的結果。它的匹配效果如此之好,以至于“谷歌”(google)今天已經成為一個被廣泛使用的動詞了。
如何辨別誰重要
如果你曾建立過一個網頁,你應該會列入一些你感興趣的鏈接,它們很容易使你點擊到其它含有重要、可靠信息的網頁。這樣就相當于你肯定了你所鏈接頁面的重要性。谷歌的網頁排序算法每月在所有網頁中進行一次受歡迎程度的評估,以確定哪些網頁最重要。網頁排序算法的提出者,謝爾蓋?布林(Sergey Brin)和拉里?佩奇(Lawrence Page)的基本想法是:一個網頁的重要性是由鏈接到它的其他網頁的數量及其重要性來決定。
我們對任意一個網頁P,以I(P)來表述其重要性,并稱之為網頁的網頁排序。在很多網站,你可以找到一個近似的網頁排序值。(例如,美國數學會的首頁目前的網頁排序值為8,最高分是10。你可以試試找到一個網頁排序值為10的網頁嗎?)這個網頁排序值僅是一個近似值,因為谷歌拒絕提供真實的網頁排序值,以阻止那些試圖干擾排序的行為。
網頁排序是這樣確定的。假定網頁Pj有lj個鏈接。如果這些鏈接中的一個鏈接到網頁Pi,那么網頁Pj將會將其重要性的1/lj賦給Pi。網頁Pi的重要性就是所有指向這個網頁的其他網頁所貢獻的重要性的加和。換言之,如果我們記鏈接到網頁Pi的網頁集合為Bi,那么
這或許讓你想起“先有雞還是先有蛋”的問題:為了確定一個網頁的重要性,我們首先得知道所有指向它的其他網頁的重要性。然而,我們可將這個問題改寫為一個更數學化的問題。
首先建立一個矩陣,稱為超鏈矩陣(hyperlink matrix),H=[Hij],其中第i行第j列的元素為
注意到H有一些特殊的性質。首先,它所有的元都是非負的。其次,除非對應這一列的網頁沒有任何鏈接,它的每一列的和為1。所有元均非負且列和為1的矩陣稱為隨機矩陣,隨機矩陣將在下述內容中起到重要作用。
我們還需要定義向量I=[I(Pi)],它的元素為所有網頁的網頁排序——重要性的排序值。前面定義的網頁排序可以表述為
換言之,向量I是矩陣H對應特征值1的特征向量。我們也稱之為矩陣H的平穩向量(stationary vector)。
讓我們來看一個例子。下圖所示為一個網頁集合(8個),箭頭表示鏈接。
其相應的矩陣為
這說明網頁8的受歡迎程度最高。下圖是陰影化的圖,其中網頁排序值越高的網頁陰影越淺。
?
計算平穩向量
有很多方法可以找到一個方陣的特征向量。然而,我們面對的是一個特殊的挑戰,因為矩陣H是一個這樣的方陣,它的每一列都對應谷歌檢索到的一個網頁。也就是說,H大約有n=250億行和列。不過其中大多數的元都是0;事實上,研究表明每個網頁平均約有10個鏈接,換言之,平均而言,每一列中除了10個元外全是0。我們將選擇被稱為冪法(power method)的方法來找到矩陣H的平穩向量 I。
冪法如何實現呢?首先選擇 I 的備選向量I0,進而按下式產生向量序列 Ik
這個方法是建立在如下的一般原理上:
一般原理:序列Ik將收斂到平穩向量I。
我們首先用個例子驗證上面的結論。
一個自然的問題是,這些數字有什么含義。當然,關于一個網頁的重要性,可能沒有絕對的度量,而僅有比較兩個網頁的重要性的比例度量,如“網頁A的重要性是網頁B的兩倍。”基于這一原因,我們可以用一個固定量去同乘以所有的重要性排序值,這并不會影響我們能獲得的信息。這樣,我們總是假定所有受歡迎程度值(popularity)的和為1,原因稍后解釋。
三個重要的問題
自然而然產生的三個問題是:
-
序列Ik總是收斂嗎?(即運算多次后,Ik和Ik+1幾乎是一樣的)
-
收斂后的平穩向量是否和初始向量I0的選取沒有關系?
-
重要性排序值是否包含了我們想要的信息?
對目前的方法而言,上述三個的答案都是否定的!下面,我們將看看如何改進我們的方法,使得改進后的算法滿足上述三個要求。先看個非常簡單的例子。考慮如下包含兩個網頁的小網絡,其中一個鏈接到另一個:
下例展示了算法的運行過程:
在這個例子中,兩個網頁的重要性排序值均為0,這樣我們無法獲知兩個網頁之間的相對重要性信息。問題在于網頁P2沒有任何鏈接。因此,在每個迭代步驟中,它從網頁P1獲取了一些重要性,但卻沒有賦給其他任何網頁。這樣將耗盡網絡中的所有重要性。沒有任何鏈接的網頁稱為懸掛點(dangling nodes),顯然在我們要研究的實際網絡中存在很多這樣的點。稍后我們將看到如何處理這樣的點,在此之前我們先考慮一種新的理解矩陣H和平穩向量I的思路。
H的概率化解釋
想象我們隨機地在網上跳轉網頁;也就是說,當我們訪問一個網頁時,一秒鐘后我們隨機地選擇當前網頁的一個鏈接到達另一個網頁。例如,我們正訪問含有lj個鏈接的網頁Pj,其中一個鏈接引導我們訪問了網頁Pi,那么下一步轉到網頁Pi的概率就是1/lj。
由于跳轉網頁是隨機的,我們用Tj表示停留在網頁Pj上的時間。那么我們從網頁Pj轉到網頁Pi的時間為Tj/lj。如果我們轉到了網頁Pi,那么我們必然是從一個指向它的網頁而來。這意味著
其中求和是對所有鏈接到Pi的網頁Pj進行的。注意到這個方程與定義網頁排序值的方程相同,因此I(Pi)=Ti。那么一個網頁的網頁排序值可以解釋為隨機跳轉時花在這個網頁上的時間。如果你曾經上網瀏覽過某個你不熟悉的話題的相關信息時,你會有這種感覺:按照鏈接跳轉網頁,過一會你會發現,相較于其他網頁,你會更頻繁地回到某一部分網頁。正如諺語所說“條條大路通羅馬,”這部分網頁顯然是更重要的網頁。
基于這個解釋,很自然地可以要求網頁排序向量I的所有元之和為1。
當然,這種表述中還存在一個問題:如果我們隨機地跳轉網頁,在某種程度上,我們肯定會被困在某個懸掛點上,這個網頁沒有給出任何鏈接。為了能夠繼續進行,我們需要隨機地選取下一個網頁;也就是說,我們假定懸掛點可以鏈接到其他任何一個網頁。這個效果相當于將超鏈矩陣H做如下修正:將其中所有元都為0的列替換為所有元均為1/n的列,前者就對應于網頁中的懸掛點。這樣修正后懸掛點就不存在了。我們稱修正后的新矩陣為S。
我們之前的例子,現在就變成了
換言之,網頁P2的重要性是網頁P1的兩倍,符合你的直觀認知了。
矩陣S有一個很好的性質,即其所有元均非負且每列的和均為1。換言之,S為隨機矩陣。隨機矩陣具有一些很有用的性質。例如,隨機矩陣總是存在平穩向量。
為了稍后的應用,我們要注意到S是由H通過一個簡單的修正得到。定義矩陣A如下:對應于懸掛點的列的每個元均為1/n,其余各元均為0。則S=H+A。
冪法如何實現?
一般而言,冪法是尋找矩陣對應于絕對值最大的特征值的特征向量。就我們而言,我們要尋找矩陣S對應于特征值1的特征向量。首先要說到的是最好的情形。在這種情形下,其他特征值的絕對值都小于1;也就是說,矩陣S的其它特征值都滿足|λ|<1。
我們假定矩陣S的特征值為λj,且
對矩陣S,假設對應于特征值λj的特征向量存在一個基向量vj。這一假設在一般情況下并不一定要成立,但如果成立可以幫助我們更容易地理解冪法如何實現。將初始向量I0寫成如下形式
那么
當j≥2時,因為所有特征值的絕對值小于1,因此這是λkj→0。從而Ik→I=c1v1,后者是對應于特征值1的一個特征向量。需要指出的是,Ik→I的速度由|λ2|確定。當|λ2|比較接近于0時,那么λk2→0會相當快。例如,考慮下述矩陣
這個矩陣的特征值為λ1=1及λ2=0.3。下圖左可以看出用紅色標記的向量Ik收斂到用綠色標記的平穩向量I。
再考慮矩陣
其特征值為λ1=1及λ2=0.7。從上圖右可以看出,本例中向量Ik收斂到平穩向量I的速度要慢很多,因為它的第二個特征值較大。
不順之時
在上述討論中,我們假定矩陣S需要滿足λ1=1且|λ2|<1。然而,我們可能會發現,這一點并不總成立。
假定網絡關系如下:
在這種情形下,矩陣S為
那么我們可以得到
在這種情況下,向量序列Ik不再收斂。這是為什么?注意到矩陣S的第二個特征值滿足|λ2|=1,因此前述冪法的前提不再成立。
為了保證|λ2|<1,我們需要矩陣S為本原(primitive)矩陣。這意味著,對某個m,Sm的所有元均為正。換言之,若給定兩個網頁,那么從第一個網頁經過m個鏈接后可以到達第二個網頁。顯然,上述最后的這個例子并不滿足這個條件。稍后,我們將看到如何修正矩陣S以獲得一個本原隨機矩陣,從而滿足|λ2|<1。
下面說明我們的方法行不通的另一個例子。考慮如下圖所示的網絡
?
在此例中,矩陣S為
注意到前四個網頁的網頁排序值均為0。這使我們感覺不太對:每個頁面都有其它網頁鏈接到它,顯然總有人喜歡這些網頁!一般來說,我們希望所有網頁的重要性排序值均為正。這個例子的問題在于,它包含了一個小網絡,即下圖中藍色方框部分。
在這個方框中,有鏈接進入到藍色方框,但沒有鏈接轉到外部。正如前述中關于懸掛點的例子一樣,這些網頁構成了一個“重要性水槽”,其他四個網頁的重要性都被“排”到這個“水槽”中。這種情形發生在矩陣S為可約(reducible)時;也即,S可以寫成如下的塊形式
實際上,我們可以證明:如果矩陣S不可約,則一定存在一個所有元均為正的平穩向量。
對一個網絡,如果任意給定兩個網頁,一定存在一條由鏈接構成的路使得我們可以從第一個網頁轉到第二個網頁,那么稱這個網絡是強連通的(strongly connected)。顯然,上面最后的這個例子不是強連通的。而強連通的網絡對應的矩陣S是不可約的。
簡言之,矩陣S是隨機矩陣,即意味著它有一個平穩向量。然而,我們同時還需要S滿足(a)本原,從而|λ2|<1;(b)不可約,從而平穩向量的所有元均為正。
最后一個修正
為得到一個本原且不可約的矩陣,我們將修正隨機跳轉網頁的方式。就目前來看,我們的隨機跳轉模式由矩陣S確定:或者是從當前網頁上的鏈接中選擇一個,或者是對沒有任何鏈接的網頁,隨機地選取其他網頁中的任意一個。為了做出修正,首先選擇一個介于0到1之間的參數α。然后假定隨機跳轉的方式略作變動。具體是,遵循矩陣S的方式跳轉的概率為α,而隨機地選擇下一個頁面的概率是1?α。
若記所有元均為1的n×n矩陣為J,那么我們就可以得到谷歌矩陣(Google matrix):
注意到G為隨機矩陣,因為它是隨機矩陣的組合。進而,矩陣G的所有元均為正,因此G為本原且不可約。從而,G存在唯一的平穩向量I,后者可以通過冪法獲得。
參數α的作用是一個重要因素。若α=1,則G=S。這意味著我們面對的是原始的網絡超鏈結構。然而,若α=0,則G=1/nJ。也即我們面對的是一個任意兩個網頁之間都有連接的網絡,它已經喪失了原始的網絡超鏈結構。顯然,我們將會把α的值取得接近于1,從而保證網絡的超鏈結構在計算中的權重更大。
然而,還有另外一個問題。請記住,冪法的收斂速度是由第二個特征值的幅值|λ2|決定的。而對谷歌矩陣,已經證明了第二個特征值的幅值為|λ2|=α。這意味著當α接近于1時,冪法的收斂速度將會很慢。作為這個矛盾的折中方案,網頁排序算法的提出者謝爾蓋?布林和拉里?佩奇選擇α=0.85。
計算排序向量 I
到目前為止,我們所討論的看起來是一個很棒的理論,然而要知道,我們需要將這個方法應用到一個維數n約為250億的n×n矩陣!事實上,冪法特別適用于這種情形。
回想隨機矩陣S可以寫成下述形式
從而谷歌矩陣有如下形式
其中J是元素全為1的矩陣,從而
現在注意到,矩陣H的絕大部分元都是0;平均而言,一列中只有10個元是非零數。從而,求HIk的每個元時,只需要知道10個項即可。而且,和矩陣J一樣,矩陣A的行元素都是相同的。從而,求AIk與JIk相當于添加懸掛點或者所有網頁的當前重要性排序值。而這只需要一次即可完成。
當α取值接近于0.85,布林和佩奇指出,需要50到100次迭代來獲得對向量I的一個足夠好的近似。計算到這個最優值需要幾天才能完成。
當然,網絡是不斷變化的。首先,網頁的內容,尤其是新聞內容,變動頻繁。其次,網絡的隱含超鏈結構在網頁或鏈接被加入或被刪除時也要相應變動。有傳聞說,谷歌大約1個月就要重新計算一次網頁排序向量I。由于在此期間可以看到網頁排序值會有一個明顯的波動,一些人便將其稱為谷歌舞會(Google Dance)。(在2002年,谷歌舉辦了一次谷歌舞會!)
總結
布林和佩奇在1998年創建了谷歌,正值網絡的增長步伐已經超過當時搜索引擎的能力范圍。在那個時代,大多數的搜索引擎都是由那些沒興趣發布其產品運作細節的企業研發的。在發展谷歌的過程中,布林和佩奇希望“推動學術領域更多的發展和認識。”換言之,他們首先希望,將搜索引擎引入一個更開放的、更學術化的環境,來改進搜索引擎的設計。其次,他們感到其搜索引擎產生的統計數據能夠為學術研究提供很多的有趣信息。看來,聯邦政府最近試圖獲得谷歌的一些統計數據,也是同樣的想法。
還有一些其他使用網絡的超鏈結構來進行網頁排序的算法。值得一提的例子是HITS算法,由喬恩·克萊因伯格(Jon Kleinberg)提出,它是Teoma搜索引擎的基礎。
總結
以上是生活随笔為你收集整理的谷歌的网页排序算法(PageRank Algorithm)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序猿要知道的事情
- 下一篇: Android使用开源项目Xutils实