【GNN】PinSAGE:GCN 在工業級推薦系統中的應用

今天學習的是 Pinterest 和斯坦福大學 2018 年合作的論文《Graph Convolutional Neural Networks for Web-Scale Recommender Systems》,目前有 200 多次引用。

論文中提出的 PinSAGE 結合了隨機遊走和 GCN 來生成節點的 Embedding 向量。同時考慮了圖結構和節點的特徵信息。此外,PinSAGE 也設計了一種新穎的訓練策略,該策略可以提高模型的魯棒性並加快模型的收斂。

這篇論文是 GraphSAGE 一次成功的應用,也是 GCN 在大規模工業網絡中的一個經典案例,爲基於 GCN 結構的新一代 Web 級推薦系統鋪平了道路。

1.Introduction

GCN 在圖數據中扮演着舉足輕重的角色,其背後的核心思想在於使用神經網絡來聚合領域的特徵信息,並且通過堆疊可以擴大節點的感受野。與純粹基於內容的深度模型(例如,遞歸神經網絡)不同,GCN 會利用內容信息以及圖結構。基於 GCN 的方法刷新很多的任務的 SOTA(state of the art),但是目前很多模型都尚未轉化到實際生產環境中。

GCN 在工業中應用的主要挑戰在於如何在數十億節點和數百億邊的網絡中高效完成訓練,對此論文提出了以下幾種改進措施:

  • 動態卷積:通過對節點的領域進行採樣構建計算圖來執行高效局部卷積,從而減輕訓練期間對整個圖進行操作的需要;
  • 生產者-消費者批處理構建:通過 mini-batch 來確保模型在訓練期間最大限度的利用 GPU;
  • 高效的 MapReduce:實際一種高效的 MapReduce 通道用於分發經過訓練的模型以生成數十億節點,同時最大程度地減少重複計算。

除了提高 GCN 的可擴展性外,作者還設計了新的訓練方式和算法創新,提高了 Embedding 的質量,從而在下游任務中帶來顯著的性能提升:

  • 通過隨機遊走構建卷積:利用短隨機遊走對圖進行採樣來代替隨機採樣;
  • Importance Pooling:基於隨機遊走相似性度量引入節點的特徵重要性權重,並根據權重進行聚合;
  • 課程學習(Curriculum Learning):由 Bengio 在 2009 年提出,主要是模仿人類學習的特徵,由簡到難的來學習課程。在機器學習領域就是先訓練容易區分樣本,在訓練難以區分的樣本。

接下來我們看下算法具體的實現。

2.PinSAGE

本節我們介紹下 PinSAGE 架構和訓練過程中的技術細節,以及 MapReduce 的通道。

先介紹下難點:

2.1 Model Architecture

我們先來總覽下模型架構:

PinSAGE 使用的是兩層局部卷積模塊來生成節點的 Embedding。左上角爲圖示例,右邊是一個兩層的神經網絡,用來計算節點 A 的 Embedding 向量。底部是節點的輸入,每個節點具有不同的輸入,但是共享神經網絡的輸入。

下圖爲局部卷積操作的前向傳播算法的僞代碼,也是 PinSAGE 算法的核心:

  • 輸入是節點 u 的 Embedding zuz_u,以及節點鄰居的 Embedding 集合 {zvvN(u)}\{z_v | v \in N(u)\},還有鄰居的權重集合 {αvvN(u)}\{\alpha_v | v\in N(u) \},聚合函數 γ()\gamma(\cdot)
  • 輸出是節點 u 的新 Embedding 向量 zunewz_u^{new}
  • 第 1 行是利用節點 u 的鄰居的 Embedding 向量、權重和聚合函數來得到節點 u 鄰居的向量表徵;
  • 第 2 行是拼接當前節點和鄰居的向量表徵後通過神經網絡得到節點 u 新的 Embedding 向量(根據經驗選擇了拼接而不是平均);
  • 第 3 行是歸一化操作,主要是爲了使訓練更加穩定,並且歸一化後的進行最近鄰搜索更加有效。

鄰居重要性:區別於以往 GCN 考慮 k-hop 圖鄰域,PinSAGE 定義了基於重要性的鄰域。具體來說,利用節點 u 開始隨機遊走,並計算基於隨機遊走訪問到的節點次數,並將訪問次數最高的 K 個節點作爲鄰域。這樣做的優點在於,聚合節點的數量固定有助於控制訓練的內存;其次在聚合鄰居節點時可以進行加權聚合;

堆疊卷積:使用多層卷積進行疊加,第 k 層卷積的輸入取決於第 k-1 層的輸出,模型參數在層內共享,在層間相互獨立。

算法 2 介紹了訓練過程中 mini-batch:

  • 輸入爲小批量節點集合 M;深度爲 K;
  • 輸出爲 Embedding zuz_u
  • 第 1 行到第 7 行爲集合 M 中的節點計算節點鄰域,這邊注意遍歷順序(K…1),這和 GraphSAGE 一個道理;
  • 第 8 行到第 14 行爲 K 層卷積操作;
  • 第 15 行到第 17 行爲模型的最終輸出。

2.2 Model Training

損失函數:爲了訓練模型,作者採用了一個類似 Hinge Loss 的損失函數,考慮邊距最大。具體來說就是最大化正樣本的內積(可以理解爲最大化正樣本間的相似度),並且正負樣本間的距離要比正樣本間的距離要大。所以損失函數爲:
JG(zq,zi)=EnkPn(q)max{0,zqznkzqzi+Δ} J_G(z_q,z_i) = E_{n_k\backsim P_n(q)}max\{ 0, z_q \cdot z_{n_k} - z_q \cdot z_i + \Delta \} \\
其中,輸入爲正樣本的節點對 (zq,zi):(q,i)L(z_q,z_i):(q,i) \in L(q,i)(q, i) 表示用戶與 q 交互後立即與 i 進行交互,下文對 q 稱爲查詢項目;Pn(q)P_n(q) 表示查詢項 q 的負樣本集合;Δ\Delta 爲超參,用於控制距離。負樣本的採樣下面會介紹。

多 GPU 訓練:爲了能夠在單臺機器上充分利用多個 GPU 進行訓練,作者以多塔(Mulit-tower)的方式訓練前向和反向傳播。對於多個 GPU,首先將每個 mini-batch (模型架構圖的底部)劃分爲相等大小,每個 GPU 將負責一部分 mini-batch,並使用相同的參數來進行計算。在反向傳播時,匯聚所有 GPU 上每個參數的梯度然後執行同步的 SGD 運算。作者針對 Pinterest 的數據規模將 mini-batch 的大小設置爲 512 到 4096 之間。此外,作者還參考了引用[2]中 Goyal等人的工作,從而確保批處理訓練時能更快收斂,並有更好的泛化精度。

生產者-消費者批處理構建:在訓練過程中,數十億節點的鄰居表和特徵矩陣都會被放在 CPU 的內存中,但是 PinSAGE 卷積計算是在 GPU 中進行的,從 GPU 訪問 CPU 內存數據效率不高。爲了解決這個問題,作者使用重新索引的技術來創建一個包含節點及其鄰域的子圖 G=(V,E)G^{'}=(V^{'},E^{'}) 鄰接表,該子圖將參與當前 mini-batch 的計算中。此外,也會提取一個與當前 mini-batch 計算相關的節點特徵的小特徵矩陣,並且保證其使用順序與子圖中的節點索引順序一致。在每次 mini-batch 計算開始時,子圖 GG^{'} 鄰接表和小特徵矩陣都會被送到 GPU 中,這樣就不需要在卷積計算的過程中進行 CPU 和 GPU 的通信,從而大大提高了 GPU 的利用率,並減少了將近一半的訓練時間。

負樣本採樣:爲了提高訓練效率,作者爲每個 mibi-batch 採樣了 500 個負樣本,即 mini-batch 中的樣本共享這 500 個負樣本。與單獨爲每個節點進行負採樣相比,其結果幾乎沒有什麼差異。對於這 500 個負樣本來說,最簡單的方法就是隨便找 500 個樣本,但是這樣並不能體現出正負樣本間的差異。爲了解決這個問題,作者爲每個正樣本對設計了“硬性”的負樣本。比如,對於每對訓練樣本 (q,i)(q,i) 來說,強負樣本爲與查詢項目 q 相關,但是與正樣本 i 不相關的樣本。強負樣本主要來源爲基於查詢項 q 的個性化 Pagerank 得分,並對排名在 2000-5000 的項目中進行隨機採樣。下圖分別展示了查詢項、正樣本、隨機負樣本、強負樣本:

課程學習(Curriculum Learning):但是在訓練過程中,使用強負樣本會使得模型收斂所需時間加倍。爲了解決這個問題,作者引入 Curriculum Learning 的訓練方式,在每個 epochs 中,第一個階段不使用強負樣本,而使用課程學習的方式進行訓練,該算法可以在參數空間中快速找到損失相對較小的區域,隨後再使用強樣本進行訓練。

2.3 Node Embeddings via MapReduce

完成訓練後,直接對所有 item 進行 Embedding 仍是一個比較大的挑戰,包括是對於那些未知的 item(冷啓動問題)。

使用算法 2 來計算節點的 Embedding 會導致很多的重複計算(k hop 會有鄰域重疊),所以爲了確保有效的計算節點的 Embedding,作者設計了一種 MapReduce 方法,這種方法將不會涉及重複計算。

下圖展示了節點 Embedding 數據流的 MapReduce 計算。

MapReduce 算法主要利用算法 1,並分爲兩個部分:

  • 首先是利用 MapReduce 作業將所有節點都映射到一個低維空間,並計算出節點的鄰域採樣和權重(算法 1 的第 1 行);
  • 然後利用另一個 MapReduce 作業進行前向傳播,通過合併(採樣後)鄰居的特徵來計算節點的 Embedding。多層網絡重複計算即可,最後一層結果爲最終的表徵向量。

2.4 Efficient nearest-neighbor lookups

作者主要通過計算 query 和 item 的 Embedding 向量的 k-近鄰來進行推薦。考慮計算複雜度,這裏使用的是局部敏感哈希的方式來近似獲得 k-近鄰,並使用基於弱 AND 運算的兩級檢索過程來實現 item 的檢索。詳細細節不進行介紹,感興趣的可以看論文及其參考文獻。

3.Experiment

簡單看一下實驗部分。

首先是 PinSAGE 與其他算法的相似度對比,勝率都在 50% 以上:

可視化展示:

衡量 Embedding 有效性的另一個指標是:考慮隨機的 Item 之間的相似度距離分分佈比較廣,如果所有節點對的距離大致相同則區分度不足。下圖爲不同模型的計算節點對相似度的概率密度函數,可以看到 PinSAGE 的相似度距離分佈更加廣泛:

下圖爲 PinSAGE 和其他模型的命中率和 MRR,可以看到 PinSAGE 的命中率提高了 150%,MRR 提高了 60%。

下圖爲利用 t-SNE 的可視化展示:

還有訓練一些參數敏感性實驗:

4.Conclusion

總結:作者提出了一種基於隨機遊走的 GCN 算法 PinSAGE,PinSAGE 具有高度可擴展性,並且能夠適配數十億節點和數百億邊的網絡。除了保證高度可擴展性外,作者還引入 Importance Pooling 和 Curriculum Learning 的技術大大提高了模型的性能和收斂速度,從實驗結果表明 PinSAGE 顯著了提升了推薦系統的效果。

5.Reference

  1. 《Graph Convolutional Neural Networks for Web-Scale Recommender Systems》
  2. 《Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour》
  3. 《Presented Slide》

關注公衆號跟蹤最新內容:阿澤的學習筆記

阿澤的學習筆記

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