在本文中,我們將演示如何使用PinSage(GCN演算法),DGL包,MovieLens資料集和Milvus構建基於圖的推薦系統。
背景推薦系統[1](RS)可以根據使用者的歷史資料識別他們的偏好,並相應地向他們推薦產品或商品。精心設計的推薦系統將為公司帶來可觀的經濟利益。
一套完整的推薦系統中包含三個元素:使用者模型,物件模型以及核心元素,推薦演算法。當前,已建立的演算法包括協作過濾,隱式語義建模,基於圖的建模,組合推薦等。在本文中,我們將提供一些有關如何使用Milvus構建基於圖形的推薦系統的簡短說明。
關鍵技術圖卷積神經(GCN)網路· PinSage
使用者在Pinterest的網站上根據自己的興趣(引腳)和相關類別(板)標記內容,累積20億個引腳,10億個板和180億條邊(僅當圖釘落入特定板時才建立邊緣)。下圖是銷釘板二部圖。
PinSage使用引腳-板二分圖從引腳中生成高質量的嵌入,以完成諸如引腳建議之類的建議任務。它具有三個關鍵的創新:
1.動態卷積
與傳統的GCN演算法不同,後者在特徵矩陣和整個圖形上執行卷積,PinSage對節點的鄰域進行取樣,並透過動態構建計算圖來執行更有效的區域性卷積。
2.用隨機遊走模型構造卷積
在節點的整個鄰域上執行卷積將導致龐大的計算圖。為了減少所需的計算,傳統的GCN演算法檢查k跳鄰居。PinSage模擬隨機遊走,將高訪問量的內容設定為關鍵鄰域,並基於此構建卷積。
3.高效的MapReduce推斷
在節點上執行區域性卷積會帶來重複計算的問題。這是因為k跳鄰域重疊。在每個聚合步驟中,PinSage無需重複計算即可對映所有節點,將它們連結到相應的上層節點,然後檢索上層節點的嵌入。
· DGL
深度相簿(DGL)[4]是一個Python軟體包,旨在在現有的深度學習框架(例如PyTorch,MXNet,Gluon等)之上構建基於圖的神經網路模型。憑藉其易於使用的後端介面,DGL可以輕鬆植入基於張量並支援自動生成的框架中。本文處理的PinSage演算法是基於DGL和PyTorch進行最佳化的。https://github.com/dmlc/dgl/tree/master/examples/pytorch/pinsage
· Milvus
獲得嵌入的第二件事是在這些嵌入中進行相似度搜索,以找到可能感興趣的專案。
Milvus [5]是一種開源的,基於AI的相似搜尋引擎,支援多種非結構化資料轉換向量。它已被400多家企業使用者採用,其應用範圍涵蓋影象處理,計算機視覺,自然語言處理(NLP),語音識別,推薦引擎,搜尋引擎,新藥開發,基因分析等。下面顯示了使用Milvus的一般相似性搜尋過程:
· 使用者使用深度學習模型將非結構化資料轉換為特徵向量,並將其匯入Milvus。
· Milvus儲存並構建特徵向量的索引。
· 在收到使用者的向量查詢後,Milvus輸出與輸入向量相似的結果。根據要求,Milvus搜尋並返回與輸入向量最相似的向量。
推薦系統的實施系統總覽在這裡,我們將使用下圖說明使用Milvus構建基於圖的推薦系統的基本過程,該基本過程包括資料預處理,PinSage模型訓練,資料載入,搜尋和推薦。
1.資料預處理
我們在本文中構建的推薦系統基於開放資料集MovieLens [5](m1-1m),其中包含6,000位使用者對4,000部電影的1,000,000個評分。由GroupLens Research Labs收集的資料包括電影資訊,使用者特徵和電影評級。在本文中,我們將使用使用者的電影歷史記錄來構建具有分類特徵的圖形,即使用者電影二部圖g。
# Build graphgraph_builder = PandasGraphBuilder()graph_builder.add_entities(users, 'user_id', 'user')graph_builder.add_entities(movies_categorical, 'movie_id', 'movie')graph_builder.add_binary_relations(ratings, 'user_id', 'movie_id', 'watched')graph_builder.add_binary_relations(ratings, 'movie_id', 'user_id', 'watched-by')g = graph_builder.build()
2. PinSage模型訓練
使用PinSage模型生成的圖釘的嵌入向量是獲取的電影資訊的特徵向量。首先,根據二部圖g和自定義的電影特徵向量尺寸(預設為256維)建立PinSage模型。然後,使用PyTorch訓練模型以獲得4000部電影的h_item嵌入。
# Define the modelmodel = PinSAGEModel(g, item_ntype, textset, args.hidden_dims, args.num_layers).to(device)opt = torch.optim.Adam(model.parameters(), lr=args.lr)# Get the item embeddingsfor blocks in dataloader_test: for i in range(len(blocks)): blocks[i] = blocks[i].to(device) h_item_batches.append(model.get_repr(blocks))h_item = torch.cat(h_item_batches, 0)
3.資料載入
將PinSage模型生成的影片嵌入h_item載入到Milvus中,Milvus將返回相應的ID。將ID和相應的影片資訊匯入MySQL。
# Load data to Milvus and MySQLstatus, ids = milvus.insert(milvus_table, h_item)load_movies_to_mysql(milvus_table, ids_info)
4.搜尋
根據影片ID在Milvus中獲取相應的嵌入,並與Milvus中的這些嵌入進行相似度搜索。然後,在MySQL資料庫中找到相應的電影資訊。
# Get embeddings that users like_, user_like_vectors = milvus.get_entity_by_id(milvus_table, ids)# Get the information with similar movies_, ids = milvus.search(param = {milvus_table, user_like_vectors, top_k})sql = "select * from " + movies_table + " where milvus_id=" + ids + ";"results = cursor.execute(sql).fetchall()
5.建議
最後,系統將向用戶推薦與搜尋查詢最相似的電影。
以上是構建推薦系統的主要工作流程。有關更多詳細資訊,請參見Milvus-Bootcamp:https://github.com/milvus-io/bootcamp/tree/0.10.0/solutions/graph_based_recommend。
系統演示除FastAPI方法外,該專案還具有一個前端演示。透過模擬使用者按自己喜歡的方式單擊電影的過程,該演示進行了電影推薦。
該系統還提供FastAPI介面和前端顯示,可根據使用者的喜好推薦電影。您可以透過登入電影推薦系統並標記您喜歡的電影來模擬該過程。
結論PinSage是圖卷積神經網路,可用於推薦任務。它透過銷釘板二部圖生成高質量的銷釘嵌入。
我們使用MovieLens資料集來建立使用者電影二部圖,並使用DGL開源軟體包和PinSage模型來生成電影的特徵向量。然後將向量儲存在Milvus(相似性嵌入搜尋引擎)中。電影的推薦隨後返回給使用者。
Milvus嵌入向量相似性搜尋引擎可以整合到各種深度學習平臺和多種AI場景中。透過充分利用最佳化的向量檢索演算法和整合的異構計算資源,Milvus可以不斷為公司提供向量檢索功能。
參考文獻· Web規模推薦系統的圖卷積神經網路,arxiv:1806.01973