PyTorch 深度学习实战 | 知识图谱嵌入结合图路径的推荐 RippleNet
本篇文章介绍 KGE 与图路径结合的知识图谱推荐算法,而 RippLeNet 在这一类的推荐算法中是最为典型且效果也非常优秀的。
01、RippLeNet 基础思想
水波网络(RippLeNet)由上海交通大学和微软亚洲在 2018 年提出。RippLeNet 有效地结合了知识图谱嵌入与知识图谱图路径提供的信息。效果很好,模型可解释性也很便于理解。该算法现在是最热门的知识图谱推荐算法之一。
它的基础思想是利用物品的知识图谱数据一层一层地往外扩散后提取节点,然后聚合 Embedding,每一层的物品会影响到在它之后的所有层,并且越往外对结果的影响就越小,就像水波一样,如图 1 所示。
■ 图 1 RippLeNet 水波扩散示意图
这听起来很像是一种图采样。虽然说 RippLeNet 的提出年份在 GCN 与 GraphSAGE 之后,但是从 RippLeNet 的论文中可以推理出,作者当时似乎并不是从图神经网络的思想出发,所以 RippLeNet 相当于从侧面碰撞到了图神经网络。
02、RippLeNet 计算过程
首先参看 RippLeNet 模型的计算总览图,如图 2 所示。
■ 图 2 RippLeNet 计算总览图
这张图初看之下有点复杂,为了方便理解,先把注意力集中在 Item Embedding UserEmbedding 和 Predicted Probability 这三项中,所以先把其余部分遮盖掉,如图 3 所示。
■ 图 3 RippLeNet 图解(1)
将其余部分先视作黑匣子。这样一来可以理解为,经过一通操作,最后将得到的 User Embedding 与 Item Embedding 做某种计算后预测出该 User 对该 Item 的喜爱程度。如何计算有很多方法,这里就先用论文中给出的最简单的计算方式,其实是在最常用的求内积之后套个 Sigmoid,公式如下:
V 代表物品向量,随机初始化即可,而用户向量 U 的计算方式如下:
公式中的
代表第 H 波的输出向量。即图 4 中用方框标记出来的长条所代表的向量。
■ 图 4 RippLeNet 图解(2)
所以关键是如何得到 o 向量,先说第 1 个 o 向量,参看以下公式组:
V 是 Item 向量,t 是 Tail 向量,h 是 Head 向量,r 是 Relation 映射矩阵,这些都是模型要学的 Embedding。式(5-33)表示的计算过程如图 5 所示。
■ 图 5 RippLeNet 图解(3)
式(5-33)中的 S1u 代表 User 的第一层 Ripple Set(第一层水波集,在图 5 中表示为 Hop 1)。首先取一定数量的用户历史交互 Item,然后由这些 Item 作为 Head 实体通过它们的关系 r 找到 Tail 实体,记作(h,r)→t,所以第二层水波(在图 2 中表示为 Hop 2)是将第一层水波得到的 Tail 实体作为这一层的 Head 实体从而找到本层对应的 Tail 实体,以此类推。
公式所表达的含义相当于是对每个 Hop 的 Tail 做一个注意力操作,而权重由 Head 和 Relation 得到。
之后将上述步骤得到的 o 向量作为下一层水波的 V 向量,然后重复进行式的计算。重复 H 次后,就可以得到 H 个 o 向量,然后代入式(图 5)得到用户向量,最后通过与物品向量点积得到预测值。
03、水波图采样
在水波网络中所谓每一层向外扩散的操作,实际上每一次都会产生笛卡儿乘积数量级的新实体,所以实际操作时需要设定一个值来限定每一次扩散取得新实体的数量上限,假设这个值为 n_memory,若某层中(尤其是初始层)的实体数量不足 n_memory,则在候选实体中进行有返回地重复采样,以此补足 n_memory 个新实体。
水波采样与 GraphSage 略有不同。最普通的 GraphSage 通常会限定每个节点采样的邻居数量,假设这个值为 n,则经过 3 层采样,则总共采集到的节点数量为 n3,而水波网络限定的是每一层采样的邻居总数量为 n,即经过 3 层采样后采集到的节点数量为 3×n。对于利用物品图谱作推荐的模型,水波采样的方式有下几点优势:
(1) 统一了每一层中实体的数量,便于模型训练时的 batch 计算。
(2) 在物品图谱中不需要对每个节点平等对待,位于中心的物品节点及周围的一阶邻居采样被采集的概率较高,而越外层的节点被采集到的概率越低,这反而更合理。水波模型中心节点是该用户历史最近交互的物品实体,而越往外扩散自然应该像水波一般慢慢稀释后续实体的权重。
水波采样的实际操作还需注意的是,训练时每一次迭代应该重新进行一次随机采样,增加训练数据的覆盖率。在做评估时同样也需重新进行一次随机采样,而不是用训练时已经采样好的水波集作为评估时的水波集。
在做预测时,理论上讲用户的 Embedding 也会根据其历史交互的正例物品通过随机采样的方式进行水波扩散而得到,所以预测时也有随机因子,用户相同的请求也会得到略有不同的推荐列表,但是如果不想有随机因子,则可采取训练时最后采样得到的水波集聚合出的用户 Embedding 直接用作后续计算。
另外水波采样的层数也有讲究,水波采样的层数最好为最小对称元路径阶数的倍数,下面来慢慢讲解这句话。
元路径的阶数指的是元路径包含的节点类型数量。例如:
元路径为电影→演员→电影,则阶数为 3。
元路径为电影→角色→演员→角色→电影,则阶数为 5。
水波采样最好通过候选物品的知识图谱扩散出去找到相关的其他目标物品,从而挖掘出推荐物品。假设目前知识图谱的最小对称元路径是电影→演员→电影,即路径阶数为 3。如果水波采样层数仅为 2,则代表每次迭代根本就没有挖掘出其他电影,而仅采集到演员,所以采样的水波层数需要不小于最小对称元路径阶数。
至于为什么最好是最小对称元路径路径阶数的倍数倒并不是很关键,为倍数的优势是因为这样大概率能在最终一层的水波集节点停留在与候选物品同样实体类型的实体上,实测后得知这对模型的训练有正向影响,但更关键的是要保证水波采样的层数要大于或等于最小对称元路径阶数。
版权声明: 本文为 InfoQ 作者【TiAmo】的原创文章。
原文链接:【http://xie.infoq.cn/article/6f64a3efd1d8118b3722979ca】。文章转载请联系作者。
评论