Fork me on GitHub

知识图谱辅助的个性化推荐系统

分享嘉宾:王鸿伟 斯坦福大学 博士后
编辑整理:秋林津渡
内容来源:将门线上直播 188 期
出品平台:将门、DataFun
导读: 互联网产业蓬勃发展的今天,个性化推荐系统是所有面向用户的互联网平台的关键技术。**知识图谱作为一种新的知识载体,为推荐系统提供了额外的辅助信息来源,并有助于提升推荐结果的多样性和可解释性。**本次分享的主题为知识图谱辅助的个性化推荐系统。

主要包括以下内容:

  • 推荐系统的基础知识
  • 知识图谱辅助的推荐方法介绍
  • 基于 embedding 的知识图谱推荐方法
  • 混合型知识图谱推荐方法

▌推荐系统的基础知识

1. 什么是推荐系统

在当前互联网时代,推荐系统是所有面向用户的互联网产品的核心技术,只要产品是面向用户的,那么就有推荐系统的需求。

推荐系统是解决信息爆炸问题,给用户推荐一个用户感兴趣的小规模集合。 用户在大量商品中,不知道如何选择,推荐系统是替用户做这个选择,猜用户的兴趣,然后给用户推荐一个小规模的商品集合,这样用户就不会迷失在大量商品中。

举几个推荐系统的例子。如下图是 imdb 系统中的电影推荐,imdb 会推荐用户可能更感兴趣的电影。

null

如下图是亚马逊系统中的图书推荐,给用户推荐和用户更相关,用户更感兴趣的书籍。

null

如下图是 booking.com 系统中旅游景点的推荐,给用户推荐更感兴趣景点。

null

如下图是我们更为熟悉的推荐系统的例子,知乎,抖音,头条等系统,都有推荐功能。

2. 推荐系统的实现方法

推荐系统主要有 2 个任务,一个是评分预测 ( Rating Prediction )。如下图左边是评分预测的例子,横坐标是物品,纵坐标是用户。表格是用户对物品的打分,这个评分可以显示的反应用户对物品的喜好程度,1 表示很不喜欢,5 表示很喜欢。推荐系统就是预测表格中问号处的缺失值,这就叫评分,这个评分叫显示反馈 ( Explicit feedback )。

另一个是点击预测 ( CTR Prediction )。右边是点击预测的例子,表格中只有 0 和 1,0 表示用户没有点击过,1 表示用户点击过,这类数据叫隐式反馈 ( Implicit feedback ),点击预测只能反映用户的非常弱的偏好程度,用户点击了不一定说明用户喜欢,比如逛淘宝,用户只是点击了某个物品就退出了,所以点击物品并不能代表用户的真实感受。

null

推荐系统有一个非常经典的方法叫协同过滤 ( Collaborative Filtering, CF ),CF 的核心是假设相似的用户有相似的偏好。

如下图为 4 个用户对 4 个物品的打分情况,来预测用户 u4 对物品 i1 的评分。通过这 4 个用户在其他 3 个商品 ( i2,i3,i4 ) 的打分,计算出其他 3 个用户和 u4 用户的相似度,分别是 0.7,0.1,0.2,然后用相似度加权平均其他 3 个用户在 i1 物品的打分,这样就得到了 u4 对 i1 的评分为 2.1。

null

协同过滤 CF 是根据历史物品评分记录,计算出用户相似度,从而预测分数。

CF 是一种常见的方法,但存在以下 2 类问题。

null

第一类是稀疏性问题 ( Sparsity ),一般情况下评分分布是相当稀疏的,比如一个用户一辈子可能只会看几百部电影,但电影总数达百万量级,所以在计算相似度的时候会有困难。

第二类更进一步,冷启动问题 ( Cold start ),当来了一个新的用户,这个新的用户没有历史记录,所以没法计算相似性,就没法做推荐。当注册新的 app 时,比如读书类的 app,系统一开始会问你对哪些主题感兴趣,因为系统没有你的历史记录,刚开始没法给你推荐。

▌知识图谱辅助的推荐方法介绍

针对推荐系统出现的问题,我们的思路是既然用户和物品交互很稀少,甚至没有,那可以引入其他的一些信息,这些引入的信息叫辅助信息 ( Side Information )。如下图是 4 类非常常见的辅助信息:社交网络;用户或商品属性特征;多媒体信息,比如电影的海报,文本信息,视频音频信息等;上下文信息,假设一个用户购买了一个商品,购买记录的一些信息,比如时间、地点、当前用户购物车的其他物品信息等。

null

1. 什么是知识图谱

知识图谱 ( Knowledge Graphs, KG ) 也是一种辅助信息。KG 是一个有向异构图 ( heterogeneous graph ),图中节点表示实体 ( entity ),边表示关系 ( relation )。

一个 KG 通常包含很多对三元组 triple ( head,relation,tail ),其中 head 和 tail 是 2 个实体 ( entity ),relation 就是边。

如下图,推荐系统的 item 是电影,所以 Forrest Gump 是推荐系统的 item,同时也是 KG 中的实体,KG 中其他的实体并不是推荐系统的 item,Forrest Gump 这部电影的主演是 Tom Hanks,虽然 Tom Hanks 是 KG 的实体 ( entity ),但并不是 item。把图中左边这些三元组 ( triples ) 组合起来,就变成了右边的一个很大的 KG。

null

2. 为什么要在推荐系统中使用 KG

如下图,假设一个用户 ( 最左边 ) 看过 3 部电影 ( item ),Cast Away,Back to the Future,TheGreen Mile,在 KG 中,可以将这 3 部电影连接到其他的一些事情上,比如 Cast Away 这部电影的类别 ( genre ) 是冒险形 ( Adventure ),Back to the Future 的导演 ( directed ) 是 Robert Zemeckis 等,可以连接到很多其他 non-item 实体上,再从这些 non-item 实体又连接到 item 电影实体上,比如最右边的 Interstellar,Forrest Gump,Raiders of the Lost Ark。

null

KG 建立一个从用户已经看过的电影到没看过的电影的连接,而这些连接不是由用户的观看记录得来的。在 CF 里,实际上是把中间这块替换成了其他用户,用其他用户历史观看记录得到这些连接。KG 提供了另外一种关于物品连接的信息来源的方法。

null

如上图是一个新闻推荐的例子,假设某个用户看过一条新闻,这个新闻的内容是:

Boris Johnson Has Warned Donald Trump To Stick ToThe Iran Nuclear Deal。

从这条新闻中提取了 4 个实体,在 KG 中,可以对这些实体做进一步的扩展,做 2 次,做 3 次扩展,又会发现这些实体都指向另外一条新闻:

North Korean EMP Attack Would Cause Mass U.S. Starvation, Says Congressional Report。

这 2 条新闻在字面上没有任何相似度,新闻的单词都不一样,但他们是很相关的,这个相关性体现在 KG 上,他们在低层是相关的,但这种相关性没法从字面意义上得到,这也是为什么要用 KG,KG 提供了一种 item 相似度的计算方式。

3. KG 能给推荐系统带来什么

第 1 个提高推荐系统的精度 ( Precision ),更准确的发现 item 之间的相似性,如下图 2 部电影,能通过 Tom Hanks 做个连接。

null

第 2 个提高推荐系统的多样性 ( Diversity ),可以通过主演扩展,可以通过电影类别扩展,也可以通过导演扩展,总有一款是用户非常喜欢的。

null

第 3 个是可解释性 ( Explainability ),可以用 KG 的 path 来解释系统为什么会推荐这部电影,如下图某个用户喜欢 Cast Away 这部电影,系统会推荐 The Terminal 这部电影,因为他们有相同的主演。

null

4. 知识图谱处理方法

KG 的处理方法中有一类方法叫 Knowledge Graph Embedding,KGE。KGE 主要是对 KG 的每个实体 ( entity ) 和每个关系 ( relation ) 学习一个低维的特征。在 KGE 中有一个基于翻译的距离模型,Translational distancemodels。

null

如上公式为 TransE 算法模型,对 KG 中的每一个 tuple(h,r,t),学习到的 entity embedding,relation embedding,使 h+r 约等于 t,这的 r 相当于翻译作用,把 h 翻译成 t,f 函数对每个 tuple 的真实分值越小越好。

null

如图(a)是 TransE 模型,假设 head 对应的 embedding 加上 relation 对应的 embedding 等于 tail 对应的 embedding。基于 TransE 有很多扩展模型,比如 TransH, TransR。

TransH 解决的是一对多的问题,某一个 head 和 relation 可能会对应多个 tail,如图(b),把 head 和 tail 都投影到一个平面上,然后让它们在相对应的平面上做转换。

TransR 是把 head 和 tail 都投影到另外一个空间中,在新的空间里让 h+r=t。

KG-Aware Recommender Systems 正式方法大概可以分为 3 类。

第一类是 Embedding-based methods,基于 KG embedding 的方法,下图列举了 5 篇论文,今天将会介绍第 2 篇和第 5 篇。

null

第二类是 Path-based methods,基于 KG 计算路径的推荐方法,今天不会涉及这类方法。

null

第三类是 Hybrid methods,结合 embedding 和 path 的方法,今天将介绍一下第 1、3、4 篇,第 3、4 是比较统一的方法。

null

5. 知识图谱辅助的推荐系统问题定义

null

已知一个用户的集合 Users,一个物品的集合 Items,用户和物品之间的交互 (relations,y_{uv}),一个包括很多 non-item 实体的 KG。图中 yuv 表示用户 u 对物品 v 的一个隐式反馈,即用户有没有点击过这个物品,目标是给定一个新的{u-v}对,预测点击率y_{uv}

null

公式定义如上图。用户集合 U={u1,u2,...},物品集合 V={v1,v2,...},交互矩阵 ( 隐式反馈 ) Y 矩阵 Y={y_{uv} ϵ {0,1} | u ϵU, v ϵV},KG 包括实体 ( entity ) 和关系 ( relation ),由很多三元组组成。

null

每个物品 v 在 KG 中可能对应一个或多个实体。物品是实体的一个子集。

目的是学习一个预测函数 F,给定一对 u,v,可以输出一个预测分值ŷ_{uv},θ是目前的一个参数。

▌基于 embedding 的知识图谱推荐方法

1. DKN 方法

DKN: Deep Knowledge-Aware Network for News Recommendation,属于基于 embedding 的知识图谱推荐方法,是 2018 年发表的论文,这篇论文是关于新闻推荐。

null

如上图,给出一段新闻,提取新闻中的实体,根据这些实体,构建一个知识图谱的子图,对知识图谱做 embedding 映射,得到每个实体的 embedding,最后就得到每个实体的特征向量。

null

如上图,对于某个实体 Fight Club,只有其对应的 embedding 还不够,在 KG 中每个实体,连接着好多其他的实体,那这些临近实体就是该实体的上下文,将这些上下文中的每个实体的 embedding 相加平均,就得到该实体的上下文 embedding。如上图公式中ē就是实体e_i的上下文 embedding。

null

在 NLP 中有一个模型叫 KimCNN,主要是给定一个 sentence,返回一个特征向量。如上图给定一个 n 个单词的 sentence ( 图中 n 为 7 ),对每个单词做 embedding 映射,embedding 的长度为 d ( 图中 d 为 5 ),得到一个 d*n 的 word embedding 矩阵。用 7 个卷积核做卷积进行 featuremaps,得到 7 个 1 维向量,对每个向量做池化 ( Max pooling ),得到该 sentence 的 word embedding。

null

前面介绍中已有 3 种特征向量,分别是实体 embeddings,上下文 embeddings,word embedings,我们的方法是把这 3 种 embeddings 做一个累加,卷积,池化,最后得到这个 sentence 的 embeddings,这种方法叫 KCNN。

null

接下来介绍基于 KCNN 做推荐的方法。如上图假设某个用户已经点击过了 3 条新闻,来了一个候选新闻,预测该用户对候选新闻的点击率。对这 4 条新闻做 KCNN 的 embedding 映射,得到 4 个特征向量。因为用户看过的新闻的重要性对候选新闻是不一样的,用 Attention Net 计算用户看过的每一条新闻和候选新闻的决策分值。用得到的分值加权观看记录,得到 User embedding。将 user embedding 和 candidate news embedding 拼接,输出一个预测的点击概率,这个就是做预测的 DKN 模型。

2. MKR 方法

MKR:Multi-TaskFeature Learning for Knowledge Graph Enhanced Recommendation,属于基于 embedding 的知识图谱推荐方法,是 2019 年发表在 WWW 的论文,是一个多任务的模型。

null

如上图为 MKR 框架,包括 3 个模块,一个是推荐模块,一个是 knowledge graph embedding, KGE 模块,还有一个是以上 2 个模块的桥梁,cross&compress units,交叉压缩单元,下面将分别阐述这 3 个模块。

null

推荐系统模块,输入是 user, item,输出是用户对物品的点击率。模块分 2 块,一个是 low-level 的部分,一个是 high-level 的部分。在 low-lever 部分,用了一个 MLP ( multi-layer perceptron ) 来处理用户的特征 UL,item 是 cross&compress units 做的处理,返回一个物品的特征 VL,把 UL 和 VL 拼接起来,用一个 recommendation system 函数 fRS,输出一个点击预测值。

null

KGE 模块,也分成 low-lever 和 high-level 部分,输入 head,用 cross&compress unites 来做特征处理,relation 用 MLP 做特征处理,把这 2 个处理结果拼接起来,经过一个 K 层的 MLP,得到一个 predictedtail,预测的 tail 和真实的 tail 用一个函数 fKG 算一个分值,这样就可以优化这个 score 值。

null

这个多任务之所以能做起来,主要是推荐系统模块的物品 ( item ) 和 KGE 模块的实体 ( entity ) 是对应的,很多 item 可以在 KGE 中找到对应的 entity,item 和 entity 是对同一个物品的描述,他们的 embedding 在某种程度上是相似的,是可以被连接的。中间的 cross&compress units 就是这个连接结合,这个模块是在每一层都有,在 l 层,输入是 item 的 embedding v_l和 entity 的 embedding e_l,输出是下一层的 embedding。

这个模块计算分 2 步,第一步是 cross,第二步是 compress。

cross 操作是将v_l,e_l做一个 cross,v_l是一个 d * 1 的向量,e^T_l是 1d 的向量,矩阵相乘后得到一个 dd 的矩阵C_l

compress 是将交叉后的矩阵 Cl 重新压缩回 embedding space,这块细节部分可以参考论文。通过参数w_l压缩输出v_{l+1},e_{l+1}

null

学习算法中 loss 的计算公式如上图。LRS 是推荐系统的 loss,预测 user-item 的分值ŷ_{uv}和真实分值y_{uv}的差距。LKG 是 KG 的 loss,对于真实 tuple(h,r,t),预测分值 score 越大越好,而对于随机替换 tuple(h', r, t') ( 负样本 ),预测的分值越小越好。LREG 是正则项。

算法实现第 1 块是推荐系统的任务,第 2 块是 KGE 任务,交替训练 2 者。在每次循环里面,做 t 次的 RS 的任务训练,做 1 次的 KGE 任务训练,做 t 次 RS 训练是因为更关注 RS 任务,这个 t 是可以调整的,这就是 MKR 模型。

▌混合型知识图谱推荐方法

1. RippleNet 方法

RippleNet: Propagating User Preferenceson the Knowledge Graph for Recommender Systems,属于混合型知识图谱推荐方法,是 2018 发表在 CIKM 的一篇论文。

null

Ripple 从名字上理解是水波的意思,水波是一层一层的,那这个算法是指在 KG 中某个实体,和该实体相连的其他实体也有一跳,二跳,三跳的关系,如上图列出了 ForrestGump 这部电影对应的 3 跳的临近实体。

null

如上图是 RippleNet 框架,输入是一对 user-item,输出是用户对物品的点击预测值。

null

对输入用户 u,获取用户的点击记录 Vu,在 KG 中找到对应的 Vu,比如图中有 2 个对应实体,获取这些实体对应的 tuple,把实体一跳的集合拿出来。对输入物品 v 做 embedding 映射。如上公式,将 item embedding v 和这些 head h_i在 R 空间中做一个 softmax,得到 v 相对于每个 head 的分值p_i

null

如上图公式,用p_i加权平均对应的 tail embedding t_i,得到输出o^1_u,即当前用户 u 的一跳的特征,对应图中绿色竖条,可以看成该用户对当前物品的一阶响应 ( User's1-order response )。

null

继续拿o^1_u特征重复之前的操作,拿o^1_u和物品二跳的 tuple 算一个 p 值,加权对应的 tail embedding,得到o^2_u

重复做下去,得到很多跳的响应值o^i_u,把这些响应值加起来,得到用户最终的 embedding。

null

用这个用户 embedding 和物品最初的 embedding 做内积,再用一个 sigmoid 函数得出点击预测值。

null

学习算法如上图,在已知 KG 和 RippleNet 系统情况下,学习参数,最大化后验概率。通过贝叶斯定理,可以把该公式拆成 3 个值。第 1 项是参数的先验分布,用上面这个公式来刻画这个先验概率分布 p(θ),这项对应的是正则项 loss。

null

第 2 项给定参数θ,KG 的概率,这项对应的是 KG 的 embedding 部分。当(h,r,t)是正样本,I_{h,r,t}接近 1,反之为 0,希望h^TRt能接近真实的 tuple 值。

null

第 3 项已知参数θ和 KG,用户和物品交互的似然函数。这个似然函数是一个伯努利分布,关于用户和物品内积的伯努力分布。

null

把这 3 项用负 log 做处理,得到 loss 函数,优化这个模型。

2. KGCN 和 KGCN-LS 方法

KGCN:Knowledge GraphConvolutional Networks for Recommender Systems,是发表在 2019 年 WWW 上的一篇论文。

KGNN-LS:Knowledge-awareGraph Neural Networks with Label Smoothness Regularization for RecommenderSystems,是发表在 2019 年 KDD 上的一篇论文,这篇是基于第 1 篇的扩展,这 2 篇论文一块讲解。

核心思想是基于 KG 辅助的推荐,但引入了一个新的模型 GCN ( 图神经网络 ),方法是基于 GCN 对 KG 扩展一个模型。

null

在 KG 中的边没有显示权值,只是一个关系类型。引入一个 relation scoring function s_{u(r)},对每个 relation 打分,从而把 KG 转换成 weighted graph。函数s_{u(r)}的输入是 user 和 relation,输出一个分值。核心思想是识别用户关注的类型,比如有些用户偏好同种类的电影,有些用户偏好某个主演的电影。s_{u(r)}用来刻画不同用户对不同 relation 的偏好程度,将 user embeding 和 relation embedding 内积,算出相应的分值。把异构 KG 转换成 weighted graph,这样一个 graph 对应邻接矩阵A_u,下标为 u 是因为每个用户对应的邻接矩阵是不一样的,s_{u(r)}是取决于用户。

null

把 KG 中实体信息通过 GNN 做一个融合,如上图公式是一个标准的 GNN 的公式,A_u是用户对应的邻接矩阵。

null

D_uA_u的三角对称矩阵 diagonal degree matrix。

null

W_l就是训练传输参数矩阵。

null

H)l,H_{l+1}是 entity 对应的 embedding 矩阵。

null

σ是一个非线性函数。

null

这个式子本质是在 KG 上做了一个多跳的 message passing,把实体周围的那些临近点的特征向中间聚集,最后一层学到的特征是融合了多跳的临近点的特征。当得到最后一层 embedding H_l后,就可以做点击预测。

null

上图公式中 u 对应的是 User embedding。

null

v_u是根据前面 KGNN 计算得出的关于用户的 entity embedding。

null

通过 f 函数得到预测值,f 函数可以取内积,或 MLP 等。到这是第 1 篇论文的 KGCN 模型。

null

如上公式,在传统 GNN 模型中,A_u是固定的,只需要训练W_l

null

但在我们的模型中,A_uW_l都需要训练,A_u是通过 relation scoring function 计算,图的结构需要训练,导致模型参数很多,容易过拟合。

null

为了防止过拟合的问题,引入一个正则项,给模型一个约束。用 label 做约束,user engagement labels,指的是用户对物品的打分值,y_{uv}是用户对某个物品的评分,这个评分是一个已知值,所以可以在 KG 中对这些点打一个标签。用户看过某部电影,对应的标签是 1,没看过的电影对应的标签是 0,对 non-item 实体没有标签。

null

下一步是预测某个点的 label,有一类算法叫标签传播算法 ( label propagation algorithm, LPA ),这个算法是优化下面这个函数。

null

遍历所有的边,A_u是边的权值。如果 i,j 节点有边,说明这 2 个节点联系比较强,那这 2 个节点的 label 会比较相近。这 2 个节点的边权值越大,那这 2 个节点的 label 就越一致。这是算法 LPA 的一个假设,标签过度是平滑的。

null

预测一个无标签的节点,将其周围节点的 label 加权平均,重复该操作直到收敛,这就是 label propagation。

null

利用 label propagation 做正则项,对于一个节点 v,其真实 lable 是y_{uv} ( 图中为 0 )。

null

利用 LPA 算法预测这个 v 的 label,得到预测值\overline{y}_{uv},算出预测值和真实值之间的损失 J。

null

在做 label propagation 时,标签传播是取决于边权值,所以最终预测值是关于边权值的函数,损失 J 也是一个关于边权值的函数。损失函数 R(A)是一个关于 A 的函数,所以可以把梯度往这个损失函数中传播,起到一个正则项的作用。

null

如上图,回顾一下整个模型,把原始异构 KG 转成 weighted graph,学习边的权值,得到一个邻接矩阵,用 GNN 得到 entity embedding,用这个 entity embedding 和 user embedding 来做这个预测,得到预测值ŷ_{uv},用ŷ和真实值 y 得到一个 loss,反向传播,将误差梯度向前传播,更新A_u和参数 W。
下面部分是正则项,邻接矩阵为参数,做一个 label propagation,得到预测值\overline{y}_{uv},用\overline{y}和 y 得到一个 loss,反向传播,更新A_u

null

总结一下,本文主要介绍了 3 个部分的内容,第 1 部分介绍了知识图谱是推荐系统的一种新的辅助信息。另外 2 个部分介绍了两类知识图谱推荐方法,一类是基于 embedding 的知识图谱推荐方法,包括 DKN 和 MKR,一类是混合型知识图谱推荐方法,包括 RippleNet、KGCN 和 KGNN-LS。

个人主页:https://cs.stanford.edu/~hongweiw/

GitHub:https://github.com/hwwang55

本文涉及的资料和代码,都可以在个人主页或 GitHub 找到。

本次分享就到这里,谢谢大家。


本文地址:https://www.6aiq.com/article/1584081777127
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出