开源| 用PaddlePaddle & Milvus 轻松搭建个性化推荐系统

背景介绍

在网络技术不断发展和电子商务规模不断扩大的背景下,商品数量和种类快速增长,用户需要花费大量时间才能找到自己想买的商品,这就产生了信息过载问题。为了解决这个问题,个性化推荐系统(Recommender System)应运而生。

个性化推荐系统是信息过滤系统(Information Filtering System)的子集,它可以用在很多领域,如电影、音乐、电商和 Feed 流推荐等。个性化推荐系统通过分析、挖掘用户行为,发现用户的个性化需求与兴趣特点,将用户可能感兴趣的信息或商品推荐给用户。与搜索引擎不同,个性化推荐系统不需要用户准确地描述出自己的需求,而是根据用户的历史行为进行建模,主动提供满足用户兴趣和需求的信息。

本文利用 PaddlePaddle 深度学习平台建立模型,结合 Milvus 向量相似度检索引擎,搭建个性化推荐系统,可以快速准确地为用户提供感兴趣的信息。

数据准备

以 MovieLens 百万数据集 (ml-1m)[1]  为例进行介绍,ml-1m 数据集包含了 6,000 位用户对 4,000 部电影的 1,000,000 条评价,由 GroupLens Research 实验室搜集整理。在原始数据中包含电影的特征数据,用户的特征数据,和用户对电影的评分,参考 ml-1m-README[2]。

ml-1m 数据集包含3个 .dat 文件:movies.datusers.dat 以及 ratings.dat

movies.dat 包含电影信息,如下面的例子所示:

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.  首先,使用用户特征和电影特征作为神经网络的输入,其中:

  • 用户特征融合了四个属性信息,分别是用户 ID、性别、职业和年龄。

  • 电影特征融合了三个属性信息,分别是电影 ID、电影类型 ID 和电影名称。

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/datasets/movielens/ml-1m.zip

[2]

ml-1m-README: http://files.grouplens.org/datasets/movielens/ml-1m-README.txt

[3]

融合推荐模型: https://www.paddlepaddle.org.cn/documentation/docs/zh/beginners_guide/basics/recommender_system/index.html#id7

[4]

Bootcamp: https://github.com/milvus-io/bootcamp/blob/master/demo/recommender_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™

发布了22 篇原创文章 · 获赞 20 · 访问量 7513
展开阅读全文

没有更多推荐了,返回首页

分享到微信朋友圈

×

扫一扫,手机浏览