圖神經網絡(GNN)是機器學習中最熱門的領域之一,在過去短短數月內就有多篇優秀的綜述論文。但數據科學家 Matt Ranger 對 GNN 卻并不感冒。他認為這方面的研究會取得進展,但其他研究方向或許更重要。
機器之心對這篇博客進行了編譯整理,以下是博客內容。
模型的關鍵是壓縮
圖經常被認為是一種「非歐幾里得」數據類型,但實際上并不是。正則圖(regular graph)只是研究鄰接矩陣的另一種方式:
如上圖所示,充滿實數的矩陣卻被稱為「非歐幾里得」,這很奇怪。
其實這是出于實際原因。大多數圖都相當稀疏,因此矩陣中會包含很多 0。從這個角度看,非零數值非常重要,這讓問題接近于(計算上很難的)離散數學,而不是(容易的)連續、梯度友好的數學。
有了全矩陣,情況會變得容易
如果不考慮物理領域的內容,并假設存在全鄰接矩陣,那么很多問題就會迎刃而解。
首先,網絡節點嵌入不再是問題。一個節點就是矩陣中的一行,因此它本身已經是數字向量。
其次,所有網絡預測問題也都被解決。一個足夠強大且經過良好調整的模型將只提取網絡與附加到節點上的目標變量之間的全部信息。
NLP 也只是一種花哨的矩陣壓縮
讓我們把目光從圖轉移到自然語言處理(NLP)領域。大多數 NLP 問題都可以看成圖問題,所以這并不是題外話。
首先,像 Word2Vec、GloVe 這類經典詞嵌入模型只進行了矩陣分解。
GloVe 算法基于詞袋(bag of words)矩陣的一種變體運行。它會遍歷句子,并創建一個(隱式)共現圖,圖的節點是詞,邊的權重取決于這些單詞在句子中一同出現的頻率。之后,Glove 對共現圖的矩陣表示進行矩陣分解,Word2Vec 在數學方面是等效的。
語言模型也只是矩陣壓縮
NLP 中許多 SOTA 方法都離不開語言模型。以 BERT 為例,BERT 基于語境來預測單詞:
這就使我們正在分解的矩陣從詞對共現發展為基于句子語境的共現:
我們正在培養待分解的「理想矩陣」。正如 Hanh & Futrell 所說:
人類語言和語言建模具有無限的統計復雜度,但可以在較低層次上得到很好地近似。這一觀察結果有兩層含義:
我們可以使用相對較小的模型獲得不錯的結果;擴大模型具備很大潛力。
語言模型解決了很大的問題空間,以至于從柯氏復雜性(Kolmogorov Complexity)角度來看,它們可能近似壓縮了整個語言。龐大的語言模型可能記住了很多信息,而不是壓縮信息。
我們能像語言模型一樣對任意圖執行上采樣嗎?
實際上,我們已經在做了。
我們將圖的「一階」嵌入稱為通過直接分解圖的鄰接矩陣或拉普拉斯矩陣(Laplacian matrix)來運行的方法。只要使用拉普拉斯特征映射(Laplacian Eigenmap)或采用拉普拉斯的主要組成部分進行圖嵌入,那它就是一階方法。類似地,GloVe 是詞共現圖上的一階方法。我最喜歡的圖一階方法之一是 ProNE,它和大多數方法一樣有效,但速度快了一個數量級。
高階方法嵌入了原始矩陣和鄰居的鄰居連接(第二階)以及更深的 k 步連接。GraRep 表明,通過擴展圖矩陣可以基于一階方法生成高階表示。
高階方法是在圖上執行的上采樣。基于大型鄰域采樣的 GNN 和 node2vec 等隨機游走方法執行的是高階嵌入。
性能增益在哪兒?
過去 5 年中,大多數 GNN 論文的實驗數據對從業者選擇要使用的模型都是無用的。
正如論文《Open Graph Benchmark: Datasets for Machine Learning on Graphs》中所寫的那樣,許多 GNN 論文基于一些節點數為 2000-20,000 的小型圖數據集進行實驗(如 Cora、CiteSeer、PubMed)。這些數據集無法真正地區分不同 GNN 方法之間的區別。
近期的一些研究開始直接解決這一問題,但是為什么研究者這么長時間一直在小型、無用的數據集上做實驗呢?這個問題值得討論。
性能和任務有關
一個令人震驚的事實是,盡管語言模型在大量 NLP 任務中達到最優性能,但如果你只是把句子嵌入用于下游模型,那么從語言模型嵌入中獲得的性能增益并不比累加 Word2Vec 詞嵌入這類簡單方法要多。
類似地,我發現對于很多圖而言,簡單的一階方法在圖聚類和節點標簽預測任務中的性能和高階嵌入方法差不多。事實上,高階方法還消耗了大量算力,造成了浪費。
此類一階方法包括 ProNE 和 GGVec(一階)。
高階方法通常在鏈接預測任務上有更好的表現。
有趣的是,鏈接預測任務中的性能差距對于人工創建的圖而言是不存在的。這表明,高階方法的確能夠學習到現實圖的某種內在結構。
就可視化而言,一階方法表現更好。高階方法的可視化圖可能會出現偽影,例如 Node2Vec 可視化會有長絲狀的結構,它們來自較長單鏈隨機游走的嵌入。高階方法和一階方法的可視化對比情況參見下圖:
最后,有時候簡單的方法能夠打敗高階方法。問題在于我們不知道什么時候一類方法優于另一類方法,當然也不知道其原因。
不同類型的圖在被不同方法表示時反應有好有壞,這背后當然是有原因的。但這目前仍是個開放性問題。
這其中的一大因素是研究空間充斥了無用的新算法。原因如下:
學術動機阻礙進步
憤世嫉俗者認為機器學習論文是通過以下方式炮制的:
使用已有的算法;
添加新的層 / 超參數,用數學形式描述其重要性;
對超參數執行網格搜索,直到該新方法打敗被模仿的那個基線方法;
絕不對在「實驗結果」部分中進行對比的方法執行網格搜索;
給新方法起個不錯的縮寫名稱,不公布 Python 2 代碼。
我不是唯一一個對當前可復現研究持此觀點的人。至少近兩年情況好了一點。
所有進展都關乎實際問題
早在四十多年前,我們就已經知道如何訓練神經網絡了,但直到 2012 年 AlexNet 出現,神經網絡才出現爆炸式發展。原因在于實現和硬件都發展到了一個節點,足以使深度學習應用于實際問題。
類似地,至少 20 年前,我們就已經知道如何將詞共現矩陣轉換為詞嵌入。但詞嵌入技術直到 2013 年 Word2Vec 問世才出現爆發式發展。其突破點在于基于 minibatch 的方法允許在商用硬件上訓練 Wikipedia 規模的嵌入模型。
如果只花費數天或數周時間在小規模數據上訓練模型,那么這個領域的方法很難取得進步。研究者會失去探索新方法的動力。如果你想取得進展,你必須嘗試在商用硬件上以合理時間運行模型。谷歌的初始搜索算法最開始也是在商用硬件上運行的。
效率更重要
深度學習研究的爆發式發展離不開效率的提升,以及更好的軟件庫和硬件支持。
模型架構沒那么重要
今年更加重要的一篇論文是 OpenAI 的《Scaling Laws for Neural Language Models》。這篇文章指出,模型中的原始參數數量是對整體性能最具預測性的特征。最初的 BERT 論文也指出了這一點,并推動了 2020 年大規模語言模型的迅速增加。
這一現實呼應了 Rich Sutton 在《苦澀的教訓 (https://mp.weixin.qq.com/s/B6rnFLxYe2xe5C5f2fDnmw)》一文中提出的觀點:
利用算力的一般方法最終是最有效的方法。
Transformer 可能也在替代卷積,正如知名 YouTube 博主 Yannic Kilcher 所說,Transformer 正在毀掉一切。它們可以和圖網絡結合,這也是最近幾年出現的方法之一,而且在基準測試中表現出色。
研究者似乎在架構方面投入了太多精力,但架構并沒有那么重要,因為你可以通過堆疊更多層來近似任何東西。
效率的勝利是偉大的,而神經網絡架構只是實現這一目標的方式之一。在架構方面投入過多的精力,只會使我們錯過其他方面的巨大收益。
當前的圖數據結構實現太差勁了
NetworkX 是一個糟糕的庫。我是說,如果你正在處理一些微小的圖,該庫表現還 OK。但如果處理大規模的圖任務,這個庫會令你抓狂且迫使你重寫所有的東西。
這時,多數處理大規模圖任務的用戶不得不手動滾動一些數據結構。這很難,因為你的計算機內存是由 1 和 0 組成的一維數組,并且圖沒有明顯的一維映射。
這種情況在我們更新圖(如添加 / 移除節點 / 邊緣)時會變得更加困難。以下提供了幾個替代選擇:
分離的指針網絡
NetworkX 就是最好的示例。每個節點對象都包含指向其他節點的指針列表(節點邊緣),其布局就像鏈表一樣。
鏈表完全違背了現代計算機的設計方式。它從內存中讀取數據非常慢,但在內存中的運行速度卻很快(快了兩個數量級)。在這種布局中,無論何時做任何事情,你都需要往返 RAM。這在設計上就很慢,你可以使用 Ruby、C 或者匯編語言編寫,但還是很慢,這是因為硬件上的內存讀取速度就很慢。
這種布局的主要優勢在于其添加了新節點 O(1)。所以如果你在維護一個龐大的圖,并且添加和移除節點的頻率與從圖中讀取數據的頻率相同,則這種布局挺適合的。
另外一個優勢是這種布局可以「擴展」。這是因為所有數據彼此之間可解耦,所以你可以將這種數據結構放置在集群上。但實際上,你正在為自身問題創造一個復雜的解決方案。
稀疏鄰接矩陣
稀疏鄰接矩陣非常適合只讀(read-only)圖。我在自己的 nodevectors 庫中將它作為后端使用,很多其他的庫編寫者使用 Scipy CSR Matrix。
最流行的布局是 CSR 格式,你可以使用 3 個數組來保存圖,分別用于邊緣終點、邊緣權重和「索引指針」,該指針說明邊緣來自哪個節點。
此外,得益于 CSR 的 3 數組布局,它可以在單個計算機上進行擴展:CSR 矩陣可以放置在磁盤上,而不用放在內存中。你只需要對 3 個數組執行內存映射,并在磁盤上使用它們。
隨著現代 NVMe 驅動器的出現,隨機搜索速度不再那么慢了,要比擴展基于鏈表的圖時進行分布式網絡調用快得多。但這種表征存在的問題是:添加一個節點或邊緣意味著重建整個數據結構。
Edgelist 表征
這種表征具有 3 個數組:分別用于邊緣源、邊緣終點和邊緣權重。DGL 包在其內部使用的正是這種表征。其簡單、緊湊的布局非常適合分析使用。
與 CSR 圖相比,該表征的問題在于某些尋軌操作(seek operation)速度較慢。假設你要找出節點#4243 的所有邊緣,則如果不維護索引指針數組,就無法跳轉到那里。
因此,你可以保持 sorted order 和二分搜索 (O(log2n)) 或 unsorted order 和線性搜索 (O(n))。
這種數據結構也可以在內存映射的磁盤陣列上使用,并且在 unsorted 版本上節點添加速度很快(在 sorted 版本上運行緩慢)。
全局方法是條死胡同
一次性處理整個圖的方法無法利用算力,因為它們達到一定規模就會把 RAM 耗盡。
因此,任何想要成為新標準的方法都要能對圖的各個部分進行逐個更新。
基于采樣的方法
未來,采樣效率將變得更加重要。
Edgewise 局部方法。我所知道的能做到這一點的算法只有 GloVe 和 GGVec,它們通過一個邊列表,并在每一步上更新嵌入權重。這種方法的問題在于,它們很難應用于更加高階的方法。但其優點也很明顯:很容易進行擴展,即使是在一臺計算機上也不例外。此外,逐漸增加新的節點也很簡單,只需要獲取現有的嵌入,添加一個新節點,然后在數據上執行一個新的 epoch。
隨機游走采樣。采用這一方法的包括 deepwalk 及相關的后續工作,通常用于嵌入而不是 GNN 方法。這在計算上可能非常昂貴,添加新節點也很困難。但它是可以擴展的,Instagram 就用它來為自己的推薦系統提供信息。
鄰接采樣。這是目前 GNN 中最普遍的一種采樣方法,低階、高階都適用(取決于 neighborhood 的大小)。它的可擴展性也很好,盡管很難高效執行。Pinterest 的推薦算法用的就是這種方法。
結論
這里有幾個有趣的問題:
圖類型和圖方法之間是什么關系?
統一的基準測試,如 OGB。
我們把隨機的模型扔給隨機的基準,卻不知道為什么或者什么時候它們表現得更好。
更基礎的研究。我很好奇:其他表示類型(如 Poincarre 嵌入)能否有效地編碼定向關系?
另一方面,我們不應該再專注于添加新的層,并在相同的小型數據集上進行測試。沒人在乎這個。
原文標題:有人說別太把圖神經網絡當回事兒
文章出處:【微信公眾號:人工智能與大數據技術】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
神經網絡
+關注
關注
42文章
4785瀏覽量
101275 -
機器學習
+關注
關注
66文章
8453瀏覽量
133156
原文標題:有人說別太把圖神經網絡當回事兒
文章出處:【微信號:TheBigData1024,微信公眾號:人工智能與大數據技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論