在網絡技術不斷髮展和電子商務規模不斷擴大的背景下,商品數量和種類快速增加,用戶須要花費大量時間才能找到本身想買的商品,這就產生了信息過載問題。爲了解決這個問題,個性化推薦系統(Recommender System)應運而生。html
個性化推薦系統是信息過濾系統(Information Filtering System)的子集,它能夠用在不少領域,如電影、音樂、電商和 Feed 流推薦等。個性化推薦系統經過分析、挖掘用戶行爲,發現用戶的個性化需求與興趣特色,將用戶可能感興趣的信息或商品推薦給用戶。與搜索引擎不一樣,個性化推薦系統不須要用戶準確地描述出本身的需求,而是根據用戶的歷史行爲進行建模,主動提供知足用戶興趣和需求的信息。python
本文利用 PaddlePaddle 深度學習平臺創建模型,結合 Milvus 向量類似度檢索引擎,搭建個性化推薦系統,能夠快速準確地爲用戶提供感興趣的信息。git
以 MovieLens 百萬數據集 (ml-1m)[1]爲例進行介紹,ml-1m 數據集包含了 6,000 位用戶對 4,000 部電影的 1,000,000 條評價,由 GroupLens Research 實驗室蒐集整理。在原始數據中包含電影的特徵數據,用戶的特徵數據,和用戶對電影的評分,參考 ml-1m-README[2]。github
ml-1m 數據集包含3個 .dat 文件:movies.dat
、users.dat
以及 ratings.dat
。網絡
movies.dat
包含電影信息,以下面的例子所示:ide
MovieID::Title::Genres
1::ToyStory(1995)::Animation|Children's|Comedy
例子表示,電影的 id 是1,標題是《Toy Story》,該電影被分爲到三個類別中。這三個類別是動畫,兒童,喜劇。函數
users.dat
包含用戶信息,以下面的例子所示:學習
UserID::Gender::Age::Occupation::Zip-code
1::F::1::10::48067
例子表示,該用戶 ID 是1,女性,年齡小於18歲。職業ID是10。測試
ratings.dat
包含評分信息,以下面的例子所示:動畫
UserID::MovieID::Rating::Timestamp
1::1193::5::978300760
例子表示,用戶1對電影1193評分是五分。
PaddlePaddle 是源於產業實踐的開源深度學習平臺,本文個性化推薦系統模型參考 Paddle 中的融合推薦模型[3]:
1. 首先,使用用戶特徵和電影特徵做爲神經網絡的輸入,其中:
2. 對用戶特徵,將用戶 ID 映射爲維度大小爲256的向量表示,輸入全鏈接層,並對其餘三個屬性也作相似的處理。而後將四個屬性的特徵表示分別全鏈接並相加。
3. 對電影特徵,將電影 ID 以相似用戶 ID 的方式進行處理,電影類型 ID 以向量的形式直接輸入全鏈接層,電影名稱用文本卷積神經網絡獲得其定長向量表示。而後將三個屬性的特徵表示分別全鏈接並相加。
4. 獲得用戶和電影的向量表示後,計算兩者的餘弦類似度做爲個性化推薦系統的打分。最後,用該類似度打分和用戶真實打分的差別的平方做爲該回歸模型的損失函數。
結合 PaddlePaddle 的融合推薦模型,將模型產生的電影特徵向量存入 Milvus 向量類似度搜索引擎,而用戶特徵做爲要搜索的目標向量,在 Milvus 中進行類似度搜索,從而得出查詢結果,做爲該用戶的推薦電影。
Milvus 中提供內積(IP)的方法來計算向量距離,數據歸一化後內積類似度與融合推薦模型中的餘弦類似度結果一致。
本文搭建 Milvus 個性化推薦系統主要有三步,具體操做參考 Bootcamp[4]。
# 運行 train.py
$ python train.py
執行此命令會在目錄下生成模型 recommender_system.inference.model
,該模型能夠將電影數據和用戶數據轉換爲特徵向量,生成應用數據以便 Milvus 存儲和檢索。
# 數據預處理, -f 後接參數原始電影數據文件名
$ python get_movies_data.py -f movies_origin.txt
執行此命令會在目錄下生成測試數據 movies_data.txt
,實現對電影數據的預處理。
第三步:Milvus 實現個性化推薦
# Milvus 根據用戶狀況實現個性化推薦
$ python infer_milvus.py -a <age>-g <gender>-j <job>[-i]
執行此命令將對指定用戶實現個性化推薦,主要過程:
load_inference_model
,將電影數據通過模型處理生成電影特徵向量。milvus.insert
加載到 Milvus 。milvus.search_vectors
作類似度檢索,返回該用戶與電影類似度最高的結果。預測某用戶感興趣的前五部電影:
TopIdsTitleScore
03030Yojimbo2.9444923996925354
13871Shane2.8583481907844543
23467Hud2.849525213241577
31809Hana-bi2.826111316680908
43184Montana2.8119677305221558
總結
融合推薦模型經過輸入用戶信息和電影信息,能夠得出二者匹配的分數,而後根據該用戶對全部電影的得分排序,從而推薦給用戶可能感興趣的電影。本文將 Milvus 與 PaddlePaddle 結合搭建個性化推薦系統,利用 Milvus 向量檢索引擎存儲全部電影特徵數據,以後在 Milvus 中對用戶特徵作類似度檢索 ,檢索結果就是系統推薦給用戶的電影排序。
Milvus[5] 向量類似度檢索引擎能夠兼容各類深度學習平臺,搜索十億向量僅毫秒響應。您可使用 Milvus 探索更多 AI 用法!
參考資料
[1]
MovieLens 百萬數據集 (ml-1m): _http://files.grouplens.org/da...
[2]
ml-1m-README: _http://files.grouplens.org/da...
[3]
融合推薦模型: _https://www.paddlepaddle.org...._guide/basics/recommender_system/index.html#id7_
[4]
Bootcamp: _https://github.com/milvus-io/..._system_
[5]
Milvus: _https://milvus.io/en/_
歡迎加入Milvus社區
Milvus 源碼
github.com/milvus-io/milvus
Milvus 官網
milvus.io
Milvus Slack 社區
milvusio.slack.com
Milvus CSDN 博客
zilliz.blog.csdn.net
© 2019 ZILLIZ™