電影推薦系統 demo 界面
推薦系統[1](Recommender System,RS)能夠根據用戶的偏好主動為用戶推薦商品或項目。它通過用戶的歷史數據來發掘用戶興趣偏好,從而將用戶可能感興趣的物品推送給用戶,一個設計出色的推薦系統能夠為企業帶來可觀的經濟效益。一個完整的推薦系統的組成必須包括三個要素:用戶模型、推薦對象模型、推薦算法。其中推薦算法是推薦系統的核心。目前,較成熟的推薦算法主要有:基于協同過濾的推薦、隱含語義模型、基于圖模型的推薦、組合推薦等。本文將為大家介紹如何利用 Milvus 搭建基于圖的推薦系統。
| 主要技術
基于圖的卷積神經網絡
- PinSage
PinSage[2]是由斯坦福和 Pinterest 公司合作提出了第一個工業級別(數十億節點和數百億邊)基于 GCN(Graph Convolutional Neural,圖神經網絡) 的推薦系算法。用戶在 Pinterest 網站中將自己感興趣的內容(pins)與相關的板塊(broads)進行標記,其中包含了 20 億 pins,10 億 boards 以及 180 億邊(若 pin 在 broads 中,那么它們之間存在一條邊),由此構成的二分圖如下圖所示:
該算法的目標是利用 pins-broards 二分圖結構,生成 pins 的高質量 embeddings 用于推薦任務,如相關 pins 推薦。PinSage 的關鍵創新點主要有[3]:
- 動態卷積:傳統的 GCN 算法對特征矩陣與全圖進行卷積;PinSage 算法對節點周圍的鄰域進行采樣,通過動態構建計算圖來執行高效的局部卷積。
- 采樣構造卷積:對節點的全部鄰域上執行卷積會導致龐大的計算圖,因此需要借助采樣減小計算量。傳統的 GCN 算法檢查 K-hop 圖鄰域;而 PinSage 通過模擬隨機游走將訪問量最高的設為重要鄰域,并基于此構造卷積。
- 高效 MapReduce:對于局部卷積的節點通常有重復計算的問題,這是由于節點的 K-hop 鄰域之間的重疊引起的。PinSage 對每個聚合步驟,將所有節點做映射而無需重復的計算,然后將其連接并發送至相應上層節點,最后進行歸約以獲取上層節點的 embeddings。
- DGL
Deep Graph Library(DGL)[4]是一個 Python 軟件包,用于在現有深度學習框架(例如 PyTorch,MXNet,TensorFlow 等)之上輕松搭建圖神經網絡模型。它提供了后端適配接口,可輕松移植到其他基于張量、支持自動生成的框架。本文的 PinSage 算法就是基于 DGL 和 Pytorch 對部分算法做了改進。詳見https://github.com/dmlc/dgl/tree/master/examples/pytorch/pinsage
Milvus 向量相似度搜索引擎
前面介紹了基于 DGL 運用 PinSage 模型可以輕松獲取高質量的 embeddings,那么接下來就需要對 embeddings 做相似度搜索,從而找出用戶可能感興趣的項目推薦給用戶。Milvus[5]是一款開源向量相似度搜索引擎,支持使用多種 AI 模型將非結構化數據向量化,并為向量數據提供搜索分析服務,可廣泛應用于圖像處理、機器視覺、自然語言處理、語音識別、推薦系統以及新藥發現。具體實現方式是:
- 通過深度學習模型將非結構化數據轉化為特征向量,并導入 Milvus 庫。
- 對特征向量進行存儲并建立索引。
- 接收到用戶的向量搜索請求后,返回與輸入向量相似的結果。
| 系統搭建
系統介紹
接下來將介紹如何利用 Milvus 搭建基于圖的推薦系統,如下圖所示,系統主要包含數據預處理、PinSage 模型、數據加載、查詢和系統推薦:
1. 數據預處理
本文搭建的推薦系統使用開放的 MovieLens[5]百萬數據集(ml-1m),包含 6,000 位用戶對 4,000 部電影的 1,000,000 條評價,由 GroupLens Research 實驗室搜集整理。原始數據中包含電影的數據信息,用戶特征信息,以及用戶對電影的評分。本文利用 MovieLens 數據集中用戶看過的電影記錄來構建一個具有分類特征的結構圖:users-movies 二分圖 g。
# Build graph
graph_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 模型獲取 pins 的 embeddings,本文主要是獲取電影數據的特征向量。首先根據構建的二分圖 g 和自定義的電影特征向量維度(默認 256 維)生成 PinSage 模型,再利用 PyTorch 訓練該模型,然后通過訓練好的模型生成 4000 條電影數據的特征向量 h_item。
# Define the model
model = 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 embeddings
for 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 并返回對應的 ID;將電影的 ID 和對應的電影數據信息導入 MySQL 結構化數據庫。
# Load data to Milvus and MySQL
status, ids = milvus.insert(milvus_table, h_item)
load_movies_to_mysql(milvus_table, ids_info)
4. 查詢
根據用戶偏好的電影 ID 在 Milvus 中獲取對應的特征向量( embeddings ),然后利用返回的特征向量在 Milvus 中進行相似度檢索,根據返回的相似結果 ID 在 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 接口和前端展示,通過模擬用戶登錄電影視頻 APP 并勾選自己喜歡的電影,從而推薦用戶可能感興趣的電影。
| 總結
基于圖的卷積神經網絡 PinSage 通過 pins-broards 二分圖結構生成 pins 的高質量 embeddings 用于推薦任務。而本文利用 MovieLens 數據集構建 users-movies 二分圖,再利用 DGL 開源包結合 PinSage 模型生成電影的特征向量,再將此特征向量加載至 Milvus 特征向量相似度搜索引擎,之后根據用戶偏好在 Milvus 中檢索,得出相似的特征向量以實現向用戶推薦電影的功能。
本文使用的 Milvus 特征向量相似度搜索引擎可以對接各種深度學習平臺,并運用于眾多 AI 領域。Milvus 充分利用現代處理器的并行計算能力,可以在單臺通用服務器上完成對十億級數據的毫秒級搜索,助力用戶高效完成非結構化數據檢索。
參考資料
- https://patentimages.storage.googleapis.com/0e/96/31/98058cb476cd77/CN105913296A.pdf
- Graph Convolutional Neural Networks for Web-Scale Recommender Systems, arxiv: 1806.01973
- https://medium.com/pinterest-engineering/pinsage-a-new-graph-convolutional-neural-network-for-web-scale-recommender-systems-88795a107f48
- https://docs.dgl.ai/en/latest/
- http://files.grouplens.org/datasets/movielens/ml-1m.zip






