【推荐系统】RippleNet——基于知识图谱偏好传播的推荐系统
论文名称:《RippleNet: Propagating User Preferences on the Knowledge Graph for Recommender Systems》
PDF:https://arxiv.org/pdf/1803.03467
源码地址:https://github.com/hwwang55/RippleNet.
一、前言
推荐系统(Recommender System, RS)作为最经典最重要的人工智能应用,已经在诸多行业中落地应用,例如国内外电商网站(淘宝、拼多多等)上的商品推荐、视频提供方(抖音、小红书、YouTube)的视频推荐等。在推荐系统任务中,有两个主题,分别是用户(User)和物品(Item),推荐系统的目标则是在给定一个用户的条件下,从海量的候选物品中寻找前K个推荐该用户,因此推荐也是对用户个性化的过程。
二、推荐系统
现如今传统的推荐系统有协同过滤(CF)、矩阵分解(MF)、因子分解机(FM),深度学习中则将推荐演化为点击率预测(CTR)+重排序(Re-ranking)的过程。但这些传统的推荐系统方法普遍存在数据稀疏和冷启动两个问题,使得推荐效果并不如意。
数据稀疏(Data Sparsity):例如在电商环境下,有许多商品(item)是奢侈品,或刚刚上架的新品,使得其很少有人取购买;或者对于一大部分的用户并不经常浏览商品或购买商品,使得大多数的用户或商品记录是稀疏的。在协同过滤任务中,通过构建user-item表可知,大多数的元素均为0.
冷启动(Cold Start):如果基于物品的推荐(itemRS),通常是根据用户的行为历史记录来进行分析和推荐,但对于一些刚刚注册的新用户,其从未在该平台留下过任何行为记录,则无法根据传统的用户相似度等方法直接进行推荐,此时则称为冷启动。
现如今有诸多方法以解决稀疏性和冷启动为动机,例如引入物品描述信息、用户的信息、用户在其他平台的行为记录等作为辅助信息(Side Information)。随着知识图谱的发展,将知识图谱作为辅助信息来解决上述两个问题的方法成为推荐系统的一种思路。我们归纳为两类:
- 基于embedding的方法:通常将知识图谱使用表示学习方法进行嵌入,即将知识图谱中的实体和边用低维度的连续向量表示,然后基于这些向量进行推荐。一般思路是用知识图谱来表示物品或用户。
- 基于路径的方法:这一类通常是将用户与物品构建成一个较大的异构图,然后通过对用户到指定物品之间的路径表示进行预测。
我们知道,协同过滤的做法是通过一个用户-物品共现矩阵的行或列向量来表示用户或物品,并使用简单的相似度度量来返回TopK个结果;本文主要希望利用知识图谱来对用户历史行为记录以及潜在的偏好进行表示,因此将推荐视为两个过程,分别是点击率预测以及排序。
点击率预测(CTR) 是指给定一个用户和一个物品,通过特征工程或深度学习表征方法分别对用户和物品进行向量化,然后使用相似度方法预测点击率,通常为0-1之间的数。另外也可以认为是一个二分类问题,例如0表示负反馈,1表示正反馈。
召回+排序:通常在推荐系统中,物品的个数是成千上万的,因此不可能将每一个物品分别与当前用户进行点击率预测,因此需要先在海量的数据中进行召回,即粗略筛选形成候选项后,再一一计算点击率。最后根据数值进行排序,返回TopK个结果。
三、RippleNet
为了同时结合两者的优势,RippleNet模型被提出,其基本思想是:
(1)像真实世界里水滴滴落水面一样,向外侧以波纹形式传播。如果每一个用户的历史点击记录就像水滴一样,则其潜在的兴趣将会向外传播,这也称作偏好传播(User Preferences propagation);
(2)如图所示,如果一个用户看过(或给与正反馈)包括“Back to the Future”、“Cast Away”和“The Green Mile”三个电影,而“Back to the Future”是由Robert导演,“Cast Away”和“The Green Mile”由Tom主演,则根据构建的知识图谱可知,Robert还导演了“Forrest Gump”,Tom也在该影片主演,所以可以推测该用户可能喜欢“Forrest Gump”电影。
在具体了解RippleNet之前,需要先了解如何构建物品知识图谱。如下图所示,是一个电影知识图谱的样例。其中节点表示物品(Item),其可能是电影,也可能是时间,也可能是导演等。边则表示两个实体之间的语义关系,例如Forrest Gump表示电影,U.S表示国籍,两者之间的关系则是拍摄地(film.country)。因此可以使用开放领域的FreeBase,也可以根据实际使用的数据集自行构建。
因此读者可能要问,如何利用知识图谱来进行推荐? 我们给出形式化的描述:
共现矩阵。 给定一个用户集合 U = { u 1 , u 2 , . . . } \mathcal{U}=\{u_1,u_2,...\} U={u1,u2,...},和物品集合 V = { v 1 , v 2 , . . . } \mathcal{V}=\{v_1,v_2,...\} V={v1,v2,...} ,因此给定一个矩阵 Y = { y u v ∣ u ∈ U , v ∈ V } \mathbf{Y}=\{y_{uv}|u\in\mathcal{U},v\in\mathcal{V}\} Y={yuv∣u∈U,v∈V} ,其中当用户 u u u 与物品 v v v 之间存在交互信息时, y u v = 1 y_{uv}=1 yuv=1 ,否则为 y u v = 0 y_{uv}=0 yuv=0 。换句话说,该矩阵为采用协同过滤方法时所构建的用户-物品共现矩阵。经验来讲,该矩阵 Y \mathbf{Y} Y 是稀疏矩阵,因此推荐系统的目标则是预测那些用户与物品没有交互的部分。
Ripple集合。如何通过知识图谱来表示用户潜在的偏好?我们首先定义Ripple集合。假设给定一个共现矩阵 Y \mathbf{Y} Y,和一个用户 u u u, 则该用户对应于共现矩阵中所有 y u v = 1 y_{uv}=1 yuv=1的物品即为历史行为记录(正反馈的物品)。我们记做 E u 0 = V u = { v ∣ y u v = 1 } \mathcal{E}^{0}_{u}=\mathcal{V}_u=\{v|y_{uv}=1\} Eu0=Vu={v∣yuv=1} 。因此该集合 E u 0 \mathcal{E}^{0}_{u} Eu0 内所有的实体对应于知识图谱中记为一个种子(Seed),每个种子可作为起点并向邻近的其他实体进行传播,每次传播记为1跳,则第k跳对应的实体集合表示为
E u k = { t ∣ ( h , r , t ) ∈ G , h ∈ E u k − 1 } \mathcal{E}^{k}_{u} = \{t|(h,r,t)\in\mathcal{G},h\in\mathcal{E}^{k-1}_{u}\} Euk={t∣(h,r,t)∈G,h∈Euk−1}
其中 G \mathcal{G} G 表示一个知识图谱, ( h , r , t ) (h,r,t) (h,r,t) 则为一个三元组,其中 h h h, t t t 为头实体和尾实体, r r r 表示二者之间的有向关系。根据这个集合,我们可以定义Ripple集合:
S u k = { ( h , r , t ) ∣ ( h , r , t ) ∈ G , h ∈ E u k − 1 } \mathcal{S}^{k}_{u} = \{(h,r,t)|(h,r,t)\in\mathcal{G},h\in\mathcal{E}^{k-1}_{u}\} Suk={(h,r,t)∣(h,r,t)∈G,h∈Euk−1}
简单的来说, E u k \mathcal{E}^{k}_{u} Euk 表示该用户 u u u 所有历史记录对应的实体所有第k跳对应的实体的集合,而 S u k \mathcal{S}^{k}_{u} Suk 则表示所有第k-1跳与第k跳对应的三元组。因此前面所谓的“偏好传播”则是通过集合 S u k \mathcal{S}^{k}_{u} Suk 体现,随着k的增大而向外传播,就像水面上的波纹一样。
特殊说明的是,当 k = 0 k=0 k=0 时,对应的实体 E u k \mathcal{E}^{k}_{u} Euk 则表示用户的历史行为数据(显式正反馈的物品),而当 k > 0 k>0 k>0 时,则是潜在的偏好。
实体表示。知识图谱的表示我们可以使用基于Trans系列的方法(例如TransE、TransH等),也可以使用语义匹配(Semantic Matching)方法,例如ComplEx、DisMult等。为了能够充分反映每一个实体在图中的语义关系,我们使用基于张量分解的方法。
模型架构。RippleNet的整体架构如下图所示:
- 首先给定一个用户 u u u,一个物品 v v v 的表示 v \mathbf{v} v, 历史记录(Seed) S u 0 \mathcal{S}^{0}_{u} Su0以及构建好的知识库 G \mathcal{G} G。首先进行第一次传播
( h , r ) → t (h,r)\rightarrow t (h,r)→t ,即 k : = 1 k:=1 k:=1 (“ := ” 表示赋值);- 获得第 k = 1 k=1 k=1 跳的的潜在偏好 S u 1 \mathcal{S}^{1}_{u} Su1, 将所有对应的尾实体 t t t 与当前的物品 v v v 进行相似度计算后加权求和,公式为:
o u 1 = ∑ ( h i , r i , t i ) ∈ S u 1 p i t i \mathbf{o}_u^1 = \sum_{(h_i,r_i,t_i)\in\mathcal{S}_u^1}p_i\mathbf{t}_i ou1=(hi,ri,ti)∈Su1∑piti
其中 h , t \mathbf{h,t} h,t 表示头尾实体的向量表示,权重 p i = s o f t m a x ( v T R i h i ) p_i = softmax(\mathbf{v^{T}R}_i\mathbf{h}_i) pi=softmax(vTRihi) 表示 S u 1 \mathcal{S}^1_{u} Su1
中每一个潜在的偏好物品与当前物品的相似度权重, R \mathbf{R} R 为关系矩阵。直观的理解即为如果当前跳内的物品与目标物品 v v v
越相似,则分配权重越大,如果恰巧 v v v 就在 S u 1 \mathcal{S}^1_{u} Su1 中,则说明其越有可能被推荐。- 将 v T R i h i \mathbf{v^{T}R}_i\mathbf{h}_i vTRihi 替换为 o u 1 \mathbf{o}_u^1 ou1,执行与1,2相同的步骤,此时 k : = k + 1 k:=k+1 k:=k+1。
如图3所示,经过一共 H H H 次传播,则可以形成 H H H 个向量 o \mathbf{o} o, 每一次传播形成的这个向量可以代表当前偏好传播所挖掘的潜在物品,但由于每一次的输入向量都是上一次的输出,则可知随着传播跳数的增加,其与目标物品的相关性也会逐渐减弱。
最后我们将这 H H H 个向量求和形成用户向量,即
u = o u 1 + o u 2 + . . . + o u H \mathbf{u} = \mathbf{o}_u^1 + \mathbf{o}_u^2 + ... + \mathbf{o}_u^H u=ou1+ou2+...+ouH
点击率预测则为 y ^ u v = σ ( u T v ) \hat{y}_{uv} = \sigma (\mathbf{u^Tv}) y^uv=σ(uTv) 。
训练策略。下面给出整个算法的流程(梯度更新)。
由于模型的输出为回归值,则使用二元伯努利分布作为损失,其次模型中可微调知识图谱表示,则额外加入张量分解损失,最后加入正则化防止过拟合。损失函数定义为:
四、讨论
在实际的实验中,我们需要注意几点:
(1)如何构建这样的知识图谱?
我们挑选了三个公开数据集 MovieLens-1M、Book-Crossing和Bing-News,其统计信息如下:
为了构建知识图谱,根据三个数据集,分别构建了其出现的所有物品及相关属性,使用实体链接工具,以及Microsoft Satori工具。
(2)如何选择 H H H 值(最大跳数)?
事实上,如果跳数太大,则可能有的用户的历史记录较多,其包含的实体数量过于庞大,不利于模型的运算,同时跳数过大,诸多实体可能会重叠,同时也可能引入大量的噪声;如果跳数过小,则有可能挖掘的候选物品很少,使得推荐的效果很低。因此我们给出四种策略:
- 大量的实体往往只有入边而没有出边;
- 在具体的推荐场景中,可以限定关系的类型。例如电影推荐,只保留与电影有关的类型的边,从而减少三元组数量;
- H H H 的选取(跳数)不宜太大;
- 在 H H H 每一跳时,可以采用固定数量的采样,而不是全部选择向量的三元组。
我们可以通过实验来选择合适的 H H H, 如图所示:
图(a)、(b)和(c)分别表示三个数据集,对应任意两个物品作为种子时,其对应跳数内实体重叠的比率。我们选择比率刚好突增时对应的跳数。三个数据集上分别选择2,3,3。
更详细的实验请阅读原文:https://arxiv.org/pdf/1803.03467
博客记录着学习的脚步,分享着最新的技术,非常感谢您的阅读,本博客将不断进行更新,希望能够给您在技术上带来帮助。