本文來自OPPO互聯網技術團隊,如須要轉載,請註明出處及做者。歡迎關注咱們的公衆號「OPPO_tech」算法
圖論是計算機科學中最重要、最有趣的分支之一,對於存在拓撲關係的業務場景,理解和使用圖能夠對業務有不少幫助。本文主要針對圖理論在大數據量下的技術和應用場景作全貌性的介紹。數據庫
在18世紀,一個叫作柯尼斯堡的城市,河流將該城市切成了四部分,割裂的土地之間經過七座橋鏈接起來了。服務器
當時,有一個與柯尼斯堡的橋相關的問題:如何只經過每座橋一次而穿過整個城市。網絡
爲了分析並解決這個問題,人們把該問題作了進一步的抽象:將割裂的區域抽象成一個節點,鏈接兩個區域的橋抽象成兩個節點之間的一條邊,進一步將該問題轉換成了最先的有關圖論的問題:柯尼斯堡七橋問題,也叫做一筆畫問題。數據結構
到了19世紀50年代,又有了一個關於地圖染色的問題將圖論的影響和關注起到了必定的推動——四色猜測。主要是說可否只用四種顏色就能爲全部地圖染色?該問題也能夠抽象成圖的問題作進一步的分析。併發
後來隨着計算機技術的發展,實際應用中業務場景的不斷豐富,人們發現了更多的應用場景中的數據結構均可以使用圖來表示。最典型的場景就是社交網絡,關於圖在社交網絡中的應用,也有不少基礎理論方面的研究,最有名的就是六度關係理論。less
該問題說的是:咱們構建一張全世界人口組織成的社交關係網絡,其中每一個人就是一個圖中的節點,人和人之間的關係就是一條邊,好比:朋友關係、同事關係、上下級關係等。運維
在這個社交網絡中的任何兩我的之間,最多須要經過六次關聯,就能夠將他們鏈接起來。好比你和比爾·蓋茨之間,中間經過六次關係擴展,大家兩個之間就能夠創建起來鏈接。對於這種很神祕的鏈接,想一想有沒有很激動。dom
再後來,Facebook在本身的社交網絡中作了研究分析,將以前的六度關係,逐步縮短到了2008年的五度關係,2011年的四度關係。機器學習
對於一個幾十億實體,百億甚至千億關係的圖,它的直徑卻只有4,可想而知在它之上要作的各類分析工做的複雜性。
複雜問題先定義並作好分類,有助於咱們開展工做。在此處,咱們將圖的分支分爲四個部分:圖的理論研究、圖存儲、圖計算和圖神經網絡。
圖的理論研究偏向本質的數據問題的分析研究,與實際應用還有一些差距,不是咱們目前要考慮的問題點,就先歸爲一類,本文不作展開;
圖存儲及檢索側重點在於實時或準實時的在線分析爲主,主要是作實體檢索、關係檢索、關係拓展、路徑計算等;
圖計算和圖神經網絡以離線計算爲主,主要用於分析整個圖的拓撲特性、社區特性等。
在海量數據下,要構建、檢索、分析一張大圖,須要合理的數據結構來進行。當前已有的圖定義的方式能夠分爲三種:超圖-HyperGraph,屬性圖-PropertyGraph,三元組-RDF。
在超圖中,實體之間是經過超邊進行鏈接的。一條超邊對應一類關係,如圖所示,相同顏色區域中的實體之間都是該類邊。
基於超圖來理解屬性圖,不一樣點是屬性圖中的實體之間的邊是獨立存在的,沒有共用。每一個實體有本身的屬性信息,好比公司的職員實體,具備屬性:姓名、生日、工號等,職員和公司之間僱傭關係,僱傭關係也有本身的屬性:入職日期等。
三元組是對RDF格式的一種形式化說法。由於RDF的每一條記錄有三個部分的內容:資源信息、屬性、屬性值。所以而得名三元組。
RDF數據格式定義來源於W3C的標準,是最先用於表徵語義網的一種數據規範。
知識圖譜領域在90年代就已開始,最先的形式就是使用W3C標準的RDF表徵語義網,後來隨着不斷的發展,國內外各個大廠也不斷在提出本身的知識圖譜產品。但底層用於存儲語義關係的存儲引擎卻不侷限在RDF模式下了,也有不少使用屬性圖的方式進行存儲。
超圖、屬性圖、RDF雖是定義圖的拓撲關係的三種不一樣範式,可是均可以正確表徵圖的拓撲特徵,並且三者之間是能夠相互轉換的。
不過隨着如今圖的應用早已不侷限在知識圖譜領域了,在社交、推薦、金融風控、運維等多個領域都有了豐富的應用場景,不一樣業務對於使用場景也有了更多的要求。
RDF這種schema-less的存儲模式在實際應用中逐漸須要搭配其餘DB來配合使用才能知足業務要求。因此屬性圖的存儲模式反而更受歡迎,從市面上能看到的圖數據庫選擇的圖存儲模式也能佐證這點。
從數據關係及檢索場景來分,數據存儲及檢索能夠大的方向上分爲四類:
K-V存儲
列式存儲
對象存儲
圖數據存儲
KV存儲類數據庫:主要針對惟一性鍵值來查找檢索對應的值,或是數值、字符串,或是列表、字典等。
列式存儲類數據庫,是結構性數據存儲的廣泛選擇。能夠進行按鍵值檢索、按列聚合分析和多表關聯分析等。對象存儲主要應用在離線數據存儲及平常服務數據冷備等場景中。
而圖數據的檢索需求與以上三個相同點,又不侷限在相同點上。好比在查找具體一個實體時,相似於KV類按鍵值檢索;在進行關係拓展分析時,相似於列式存儲中多表join操做。
所以構建一個高效可用的圖數據庫也須要兼顧考慮到不一樣檢索使用場景下的特色來進行全局分析。
回想下在大學期間學習數據結構時,對裏面的圖是如何定義和分析使用的。
以該有向圖爲例,咱們使用鄰接矩陣的形式來表示圖中的節點和邊,矩陣爲|V| * |V|規模的方陣,矩陣中的值表示兩個節點之間是否存在關係,若是有則置爲1,沒有則置爲0。
對於這種小數據量的圖數據,在實際的應用程序中進行處理的時候,爲了便於擴展,一般使用鏈表來存儲。
然而這些美好的、簡單易用的處理邏輯也只能停留在課堂做業中而已,對於互聯網業務場景中的海量數據,想構造一個百萬乘百萬、一億乘一億的鄰接矩陣來進行運算,基本不具有可行性。
因此咱們須要對海量圖數據的存儲及檢索方式作相應的合理設計。不一樣的圖數據庫對於圖數據存儲的格式總有些異同,可是對於圖中的關聯關係確定都是不變的,好比實體和自身屬性的關聯關係、實體和關係的對應關係等。
主流的圖數據庫中,對於圖數據的存儲主要有兩種方式:
拓撲關係和屬性數據集成
拓撲關係和屬性數據分離
拓撲關係和屬性數據集成的存儲方式中,能夠將屬性數據和關係列表數據統一做爲實體這個Key對應的Value。
這樣能夠經過查找到實體後,很方便的擴展到屬性數據集關係數據。一般爲了查詢上的高效,會將關係數據存儲兩份,根據出節點和入節點各對應一組相同的邊列表。
拓撲關係和屬性數據分開存儲的方式中,拓撲關係只存儲邊數據,屬性數據可使用KV存儲引擎進行管理。
這樣在進行檢索的時候,按照不一樣查詢場景進行區分操做:好比只查詢單實體及其屬性信息時,就能夠只經過KV進行檢索便可;而查找拓撲關係時,須要結合拓撲存儲及屬性存儲二者交互進行。
這樣的分類存儲的方式在某些場景的效率較高。可是實際圖數據庫的檢索應用場景中,大多數的請求都是須要結合拓撲和屬性數據共同進行的,這就須要在兩個存儲引擎中進行交互來整合最終結果數據。
除此以外,拓撲關係和屬性數據分開存儲也有本身的進階版設計。
就是在拓撲關係存儲中,擴展存儲少許經常使用的屬性數據,而不是單單隻有拓撲數據。這樣對於某些常見的查詢也能夠只使用拓撲關係類數據便可獲得檢索結果。
在近年來,隨着應用場景的逐漸豐富,圖數據庫市場逐步趨熱的背景下,圖數據庫產品的發展也有了長足的進展。從DB-Engines的最新統計分析中也能夠看到,圖數據庫的趨勢一騎絕塵。
在圖數據庫市場中,實際的產品矩陣咱們這裏分紅三個維度來看:
企業服務版
開源版
雲服務商
圖數據庫的企業服務提供商中,典型的表明就是TigerGraph、DataStax、Neo4j等。
在開源的圖數據庫中,關注比較多且社區比較活躍的有JanusGraph、DGraph、Neo4j、S2Graph。(Apache孵化中的一個圖數據庫產品,目前功能還比較簡單,並且感受活躍度也比較低)
同時,在愈來愈多的公司上雲的趨勢下,國內外各大雲服務商也將圖數據庫加到了本身的產品矩陣中。好比:AWS的Neptune、Azure的CosmosDB、阿里雲的GraphDB、騰訊雲的星圖(TKGD)、華爲雲的GES等。
另外一方面,不一樣的圖數據庫產品之間也有各類藕斷絲連,分不清理還亂的關係。好比Neo4j,既有收費的企業版,也有開源的單機版。
不過Neo4j的單機版有些使用上的限制:
好比同時只能有一個打開的圖,進程使用的核數也有限制;
好比企業版的DataStax公司的圖數據庫是收購了Titan而來的,Titan在被收購後,開源社區有fork出了新的分支:JanusGraph。百度的HugeGraph也是基於Titan、JanusGraph的基礎之上開發而來的。
從圖數據的存儲範式上來看,使用屬性圖是絕大多數圖數據庫的選擇,也有少部分使用的是RDF的存儲方式,好比DGraph,Stardog等。
值得一提的是,在使用圖數據庫時,須要使用到圖查詢語言,而圖查詢語言也有多個不一樣形態的語言。典型的有:TinkerPop Gremlin、Neo4j的Cypher、TigerGraph的GSQL、用於RDF類圖數據查詢的SparQL等。
不過Gremlin的圖遍歷語言目前的使用面應該是最廣的,在沒有統一標準的圖查詢語言中,感受也算是半個不成文的標準了。
在實際應用中,圖數據庫可以提供的主要檢索功能有:
實體查找:即根據實體的ID或者某幾個屬性信息進行過濾查找具體的實體信息;
關係拓展:主要是實體的鄰居查找,多跳關係查找,以及基於多跳關係查找基礎之上的各類條件過濾查詢;
路徑分析:根據已知的兩個實體,查找他們之間的最短路徑,全路徑等信息。
在拓撲關係的拓展檢索場景中,與傳統數據庫對比,圖數據庫少了屢次的交互及表間關聯操做。
舉個例子,對比下關係型數據庫與圖數據庫在相同查詢場景下的區別:
在這個例子中,咱們如今要查找員工Alice所處的部門名稱。
Q:假設Alice能夠同時任職於多個部門
在關係型數據庫中,可能存在三張表:員工信息表、員工與部門關係表、部門信息表,咱們寫SQL進行查找,須要進行兩次JOIN操做才能獲取Alice所處的部門名稱。
而對於使用圖數據庫來存儲及檢索的話,能夠將員工和部門都定義爲實體,而他們之間的關係就是從屬關係,這樣可使用圖查詢語言一句話查找獲得結果。
對比能夠看到,不管是操做的複雜度仍是所需計算複雜度,都大大下降了。
得益於圖數據庫在拓撲關係類分析中的優點,實際落地在有圖應用的場景裏面也變的愈來愈多,舉幾個典型的例子:
從知識存儲沉澱到知識檢索發現,經過知識內部的關聯關係不斷拓展,強化知識表達的內容豐富度。
如今的知識圖譜會擴充了更廣義的應用場景,將NLP技術的應用加入進來。
從原始的非結構化文本中進行實體的抽取、關係的抽取和預測、實體的不一樣說法之間的消歧等等。這些都對知識圖譜的圖數據構建及使用提供了極大的便利和業務場景的拓寬。
社交網絡與圖結構自然適配,經過圖數據庫將社交網絡中的實體與關係數據存儲起來後,能夠用做好友推薦、興趣羣組推薦等,如今這種網絡也能夠擴展到將社交網絡與內容推薦網絡整合起來,給用戶推薦商品、諮詢等。
除此以外,還有金融風控、企業IT運維等也能夠將圖數據庫應用起來併發揮價值,好比金融機構能夠經過圖來分析我的及公司的信貸風險,IT運維工程師能夠經過圖來分析服務器異常、交換機故障的影響範圍並制定應對措施等。
圖計算:是圖理論技術在實際應用中的另外一個主要陣地,圖計算的發展也經歷了算力發展、場景豐富、技術研究對圖計算的不斷推動。
到如今爲止,除了PageRank,LPA等常見的算法外,也有了與神經網絡結合的圖神經網絡算法,可應用在對拓撲結構的嵌入向量表達及節點、關係預測中。
咱們這裏介紹幾個常見的圖算法:PageRank、Label Propagation、Random Walk。
PageRank:是Google公司所使用的對其搜索引擎搜索結果中的網頁進行排名的一種算法。
PageRank本質上是一種以網頁之間的超連接個數和質量做爲主要因素粗略地分析網頁的重要性的算法。其基本假設是:更重要的頁面每每更多地被其餘頁面引用。(或稱其餘頁面中會更多地加入通向該頁面的超連接)
其將從A頁面到B頁面的連接解釋爲「A頁面給B頁面投票」,並根據投票來源(甚至來源的來源,即連接到A頁面的頁面)和投票對象的等級來決定被投票頁面的等級。簡單的說,一個高等級的頁面能夠提高其餘低等級的頁面。
該算法以谷歌公司創始人之一的拉里·佩奇(Larry Page)的名字來命名。谷歌搜索引擎用它來分析網頁的相關性和重要性,在搜索引擎優化中常常被用來做爲評估網頁優化的成效因素之一。
當前,佩奇排名算法再也不是谷歌公司用來給網頁進行排名的惟一算法,但它是最先的,也是最著名的算法。
Label Propagation算法:是一種基於標籤傳播的局部社區劃分算法。
對於網絡中的每個節點,在初始階段,Label Propagation算法對每個節點一個惟一的標籤。在每個迭代的過程當中,每個節點根據與其相連的節點所屬的標籤改變本身的標籤。
更改的原則是選擇與其相連的節點中所屬標籤最多的社區標籤爲本身的社區標籤,這即是標籤傳播的含義。隨着社區標籤的不斷傳播,最終緊密鏈接的節點將有共同的標籤。
Label Propagation算法最大的優勢是其算法過程比較簡單。
想比較於優化模塊度的過程,算法速度很是快。Label Propagation算法利用網絡的結構指導標籤的傳播過程,在這個過程當中無需優化任何函數。在算法開始前咱們沒必要要知道社區的個數,隨着算法的迭代,在最終的過程當中,算法將本身決定社區的個數。
Random Walk是一種數學統計模型,它是一連串的軌跡所組成,其中每一次都是隨機的。
它能用來表示不規則的變更形式,如同一我的酒後亂步,所造成的隨機過程記錄。隨機遊走的探尋過程主要是基於過去的表現來選擇下一步,沒法預測未來的發展步驟和方向,相似於物理學中的布朗運動。
近幾年深度學習的技術在CV和NLP領域取得了長足的發展,圖在結合神經網絡的基礎上也發展出了圖神經網絡方面的相關算法。
主要有Graph Embedding、Graph Convolution Network、Graph Attention Network等;
其中Graph Embedding和GCN在實際的業務場景中的使用居多,咱們這裏主要對這兩類方法作個簡單介紹。
DeepWalk主要方式是與天然語言處理中重要的Word Embedding方法Word2Vec聯繫了起來,使得Network Embedding問題轉化爲了一個Word Embedding問題。
DeepWalk經過從每一個結點出發n_walks次,每一步都採起均勻採樣的方式選擇當前結點的鄰接結點做爲下一步的結點隨機遊走。
當遊走的路徑長度達到walk_length後,中止一次遊走。
這樣就生成了一個個遊走的序列,每一個序列都稱爲一個walk。每一個walk都被當成Word2Vec中的一個句子,而每一個結點都是Word2Vec中的一個詞。
有了具體的圖中的「詞」和「句子」後,以後的算法幾乎和Word2Vec的SkipGram版本徹底同樣。使用一個大小爲window_size的滑動窗口做爲一條walk的context,使用一個context中的中心詞去推測全部context中的其餘詞,使用的目標函數也與Word2Vec一致。
類比可知,這裏的Embedding就是每一個節點在整個圖的拓撲結構中的嵌入表達。可使用預訓練獲得的embedding向量作進一步的業務使用,如推薦等。
雖然DeepWalk經過隨機遊走的方式,將圖結構數據轉化爲了天然語言處理的任務來完成。
可是,圖結構中節點的關係每每比詞上下文關係更加的複雜。一般部分的圖結構數據中邊具備權重,使用現有的Word2Vec方法沒法很好的應對這個問題。
此外,在現實世界數據中,圖的規模每每過於龐大,以致於存下全部的walk的開銷將十分驚人。
LINE(Large-scale Information Network Embedding)再也不採用隨機遊走的方法。相反,他在圖上定義了兩種類似度:一階類似度與二階類似度。
一階類似度:一階類似度就是要保證低維的嵌入中要保留兩個結點之間的直接聯繫的緊密程度,換句話說就是保留結點之間的邊權,若兩個結點之間不存在邊,那麼他們之間的一階類似度爲0。例以下圖中的六、7兩個結點就擁有很高的一階類似度;
二階類似度:二階類似度用一句俗話來歸納就是「我朋友的朋友也多是個人朋友」,他所比較的是兩個結點鄰居的類似程度。
若兩個結點擁有相同的鄰居,他們也更加的類似。若是將鄰居看做context,那麼兩個二階類似度高的結點之間擁有類似的context。這一點與DeepWalk的目標一致。例以下圖中的五、6兩點擁有很高的二階類似度。
Node2Vec認爲,現有的方法沒法很好的保留網絡的結構信息。
例如圖所示,有一些點之間的鏈接很是緊密(好比u, s1, s2, s3, s4),他們之間就組成了一個社區(community)。網絡中可能存在着各類各樣的社區,而有的結點在社區中可能又扮演着類似的角色(好比u與s6)。
Node2Vec的優化目標爲如下兩個:
讓同一個社區內的結點表示可以相互接近;
在不一樣社區內扮演類似角色的結點表示也要相互接近。
爲此,Node2Vec就要在DeepWalk現有的基礎上,對隨機遊走的策略進行優化。Node2Vec提出了兩種遊走策略:
1.廣度優先策略
2.深度優先策略
就如上圖的標註所示,深度優先遊走策略將會限制遊走序列中出現重複的結點,防止遊走掉頭,促進遊走向更遠的地方進行。
而廣度優先遊走策略相反將會促進遊走不斷的回頭,去訪問上一步結點的其餘鄰居結點。
這樣一來,當使用廣度優先策略時,遊走將會在一個社區內長時間停留,使得一個社區內的結點互相成爲context,這也就達到了第一條優化目標。
相反,當使用深度優先的策略的時候,遊走很難在同一個社區內停留,也就達到了第二條優化目標。
那麼如何達到這樣的兩種隨機遊走策略呢,這裏須要用到兩個超參數p和q用來控制深度優先策略和廣度優先策略的比重,經過p和q的調整,就能夠是業務跟進本身的特色來選擇對於BFS和DFS的偏重了。
深度學習的應用中最廣的是CV領域的CNN和NLP領域的RNN。可是這二者一種適用於處理規範的網格數據,一種適用於處理序列化數據。
而對於圖數據,拓撲關係屬於非歐結構的,好比CNN在Non Euclidean Structure的數據上沒法保持平移不變性。
簡單理解就是在圖中的每一個節點的鄰居節點數據是不一樣的,因此沒法使用一樣一個尺寸的卷積核來進行卷積運算。
可是人們又但願在這樣的數據結構上有效的提取空間特徵來進行機器學習,因此GCN就成了研究的重點。
GCN的本質目的就是用來提取拓撲圖的空間特徵。
簡單來講就是使用拉普拉斯矩陣來計算並構造卷積核,輸入圖網絡結構,中間傳遞過程保持住了圖的拓撲關聯性。GCN能夠用於節點預測、關係預測及生成Embedding向量用做其餘場景的應用。
GraphEmbedding和GCN目前應用場景最多的當屬推薦了,這裏給一個推薦中使用DeepWalk進行效果提高的主流方案。
區別於傳統推薦的基於用戶和商品之間之間關聯和畫像特徵來進行整合,並設計推薦算法。圖神經網絡在該場景中,從兩個方面提出了新的思路:
針對用戶瀏覽商品的順序,構建商品的序列關係;
根據用戶瀏覽商品的關聯關係,構建二部圖。(用戶和商品之間存在關係,用戶之間和商品之間無關聯)
針對這兩類圖都可以使用DeepWalk生成Embedding向量,並進一步用做推薦。
全文從三大部分進行圖的技術及應用概述:
圖的起源發展及定義方式;
圖數據庫的技術及應用;
圖計算和圖神經網絡的介紹
圖數據庫和圖計算,這兩個分支都是有不少內容值得詳細深挖研究的,這裏只作了概述性的引入,後續逐步來經過專題進行學習和分享。