RippleNet: Propagating User Preferences on the Knowledge Graph for Recommender Systems阅读笔记
RippleNet: Propagating User Preferences on the Knowledge Graph for Recommender Systems阅读笔记
-
- 一些絮叨
- Motivation
- Model
- Optimization
- Discussion
Graph for Recommender Systems阅读笔记)
一些絮叨
大家好,我是某不知名大学的不知名硕士,目前主要从事图神经网络方面的研究。首先声明一下,这是迄今为止,本人写第一篇博文,因此,有任何理解不到位或行文逻辑等各种问题,希望大家能够批评指正,本人会在日后的写作中多加注意。另外,本人写博文的目的在于为自己建立便捷的知识索引,同时也希望能对同行有所帮助。
Motivation
在推荐系统中,通常通过引入边信息(Social Network,Item Attributes)来解决冷启动和稀疏问题。这边文章引入**Knowledge Graph(KG)**作为边信息,并克服了embedding-based和path-based在KG上的局限,提出了RippleNet。该模型类似于物理中的点扩散过程,具体来说,就是根据user的历史行为在KG上进行点扩散,详细的扩散策略会在模型中进行介绍。这里有一点需要指出,paper中提到的冷启动可能不是指的user冷启动。
Model
模型简单有效也是这个工作的一大亮点吧。该模型是通过学出user以及item的embedding来进行推荐的,下面来介绍下RippleNet。
想像一个雨天,平静的水面上荡起涟漪。前面的KG就是这里的水面,user历史行为就是雨滴。RippleNet就是来model这些涟漪如何传播。user的历史行为指的是点击、观看等,即对应user-item矩阵中value为1的元素。为了更加直观的解释model,我们以索引为0的user举例。首先,不妨定义user-item矩阵为Y \in \mathbb R^{d_u \times d_v},则索引为0的user对应着Y_0 \in \mathbb R^{d_v}。那么,通过访问Y_0就可以得到user_0的历史行为。实际上,我们可以在KG中找到与user_0历史行为(items)对应的entities,这就是落在水面上初始的raindrops。接下来就是paper的重头戏了,如何在KG中进行preference propagation 。众所周知(嘿嘿),KG是以形如(h,r,t)三元组的形式组织起来的,其中h是head,r是relation,t是tail。原文给出了如下两个定义:


基于上述定义,仍然使用user_0来进行说明,\mathcal S^k_0表示的就是对应((k-1)-hop entity, r, k-hop entity)的集合。有了这样的定义,我们来看下RippleNet的结构,直接放图:

在Figure 2 中,item v 所指向的是embedding层,这与Word2vec的第一层相同。之后则是stack在不同Ripple Set下的propagation layer, propagation的策略是:对于任一第(k-1)-hop的entity,由(k-1)-hop传向k-hop,传播的强度有(k-1)-hop entity及relation共同决定,并输出在传播强度下的weighted sum,公式化如下:


这里p_i表示指向第i个尾实体的传播强度,并采用softmax归一化的形式。o^1_u表示在Ripple Set \mathcal S^1_u下的输出,这个输出在后续层被作为输入,并在\mathcal S^2_u, \mathcal S^3_u, \mathcal S^4_u等Ripple Set上重复上述过程。另外,在简单stack这些层的基础上,网络还采用Res Connection,文章给的解释是避免低阶hop的信息被稀释。在stack了n层之后,网络output了一个向量user embedding。为什么这个向量可以是user embedding?因为RippleNet中的Ripple Set是user-aware的,也就是个性化的结构信息对应着每个用户,这样就建立起了联系。网络的最后就是user embedding和item embedding做了一个inner product接sigmoid function,从而输出点击的probability:

可以看出,整个RippleNet是一个embedding网络,需要学习的参数包括V, E, R,即item embedding, entity embedding 及 relation embedding。
Optimization
关于模型的优化,author说是最大化一个后验概率:

可以这么说,但没必要(嘿嘿)。这里,我们直观地去考虑这个问题,实际上是一个二分类(点击与未点击、观看与未观看),伯努利分布,所以第一个loss用二分类交叉熵;因为要学习entity embedding,且这个entity是在graph(KG)上的,显然要加入图正则约束;另外,再加上众所周知的参数正则项。所以, total loss function如下:

当然,在此基础上,为了提高模型训练的效率,author在两个层次进行负采样:1. 在user-item matrix上进行负采样;2. 在KG上进行负采样。整体的算法如下:

Discussion
至此,我们对RippleNet的原理已介绍完毕。有几个问题我想提出一下:
一、冷启动问题似乎对该模型并不友好,item冷启动还好,尤其是user冷启动。因为该模型是基于用户历史行为的,而新加入的用户缺少raindrops,如何在水面上荡起ripple呢?
二、author称RippleNet是embedding-based和path-based方法的combination。首先,embedding-based这个很显然;然后,path-based中的path实际上是embedding-based path(哈哈)。所以,我不太懂作者这样说是不是过于牵强,这种一箭双雕的事情是得益于graph regularization?
三、我还没有看过源码,所以我先猜测RippleNet需要存放大量的embedding,如果数据是billion级别甚至更高,内存会不会爆掉。(这方面笔者是小白一个,请大神指教。)
四、在Algorithm 1 的line 6和7中,\alpha_i是什么意思?指的是res connection的weight吗?
********************************** 先写到这里吧,后续会Debug***************************************
