2021年的第一盆冷水:有人說別太把圖神經網絡當回事兒

來源:數學中國

圖神經網絡(GNN)是機器學習中最熱門的領域之一,在過去短短數月內就有多篇優秀的綜述論文。但數據科學家 Matt Ranger 對 GNN 卻並不感冒。他認爲這方面的研究會取得進展,但其他研究方向或許更重要。

博客鏈接:https://www.singlelunch.com/2020/12/28/why-im-lukewarm-on-graph-neural-networks/

機器之心對這篇博客進行了編譯整理,以下是博客內容。

模型的關鍵是壓縮

圖經常被認爲是一種「非歐幾里得」數據類型,但實際上並不是。正則圖(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 可視化會有長絲狀的結構,它們來自較長單鏈隨機遊走的嵌入。高階方法和一階方法的可視化對比情況參見下圖:

最後,有時候簡單的方法能夠打敗高階方法。問題在於我們不知道什麼時候一類方法優於另一類方法,當然也不知道其原因。

不同類型的圖在被不同方法表示時反應有好有壞,這背後當然是有原因的。但這目前仍是個開放性問題。

這其中的一大因素是研究空間充斥了無用的新算法。原因如下:

學術動機阻礙進步

憤世嫉俗者認爲機器學習論文是通過以下方式炮製的:

  1. 使用已有的算法;

  2. 添加新的層 / 超參數,用數學形式描述其重要性;

  3. 對超參數執行網格搜索,直到該新方法打敗被模仿的那個基線方法;

  4. 絕不對在「實驗結果」部分中進行對比的方法執行網格搜索;

  5. 給新方法起個不錯的縮寫名稱,不公佈 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 的推薦算法用的就是這種方法。

結論

這裏有幾個有趣的問題:

  1. 圖類型和圖方法之間是什麼關係?

  2. 統一的基準測試,如 OGB。

  3. 我們把隨機的模型扔給隨機的基準,卻不知道爲什麼或者什麼時候它們表現得更好。

  4. 更基礎的研究。我很好奇:其他表示類型(如 Poincarre 嵌入)能否有效地編碼定向關係?

另一方面,我們不應該再專注於添加新的層,並在相同的小型數據集上進行測試。沒人在乎這個。

這篇博客在 Reddit 上引發了一些討論,詳情參閱:https://www.reddit.com/r/MachineLearning/comments/kqazpd/d_why_im_lukewarm_on_graph_neural_networks/

未來智能實驗室的主要工作包括:建立AI智能系統智商評測體系,開展世界人工智能智商評測;開展互聯網(城市)雲腦研究計劃,構建互聯網(城市)雲腦技術和企業圖譜,爲提升企業,行業與城市的智能水平服務。

  如果您對實驗室的研究感興趣,歡迎加入未來智能實驗室線上平臺。掃描以下二維碼或點擊本文左下角“閱讀原文”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章