emm…图片复制过来显示不了(因为我太懒了0.0),要看图的话可以去我的博客瞅瞅,嘿嘿嘿
对了,有些英文短句假如翻译成中文,阅读的时候就太搞脑子了,所以我干脆就不翻译了
我的博客地址:https://hikg.net/archives/125/
先前的方法仅仅使用描述性特征(比如ID、属性)来构造embedding function,而没有考虑过user-item interactions(或者仅仅是在定义目标函数时使用)
High-order connectivity表示到达 u 1 u_1 u1的,路径长度大于1的节点
例如: u 1 ← i 2 ← u 2 u_1 \leftarrow i_2 \leftarrow u_2 u1←i2←u2表示 u 1 u_1 u1、 u 2 u_2 u2之间的行为相似度,因为这两者都与 i 2 i_2 i2发生过交互
u 1 ← i 2 ← u 2 ← i 4 u_1 \leftarrow i_2 \leftarrow u_2 \leftarrow i_4 u1←i2←u2←i4,表示 u 1 u_1 u1很可能对 i 4 i_4 i4感兴趣,因为相似的用户 u 2 u_2 u2之间与 i 4 i_4 i4发生过交互。
模型分为3层:
将user u(item i)的单个embedding向量 e u ∈ R d e_u \in \mathbb{R}^d eu∈Rd( e i ∈ R d e_i \in \mathbb{R}^d ei∈Rd)组建成 一个embedding look-up table,用作之后进行传播的初始矩阵:
E = [ e u 1 , . . . , e u N , e i 1 , . . . , e i M ] E = [e_{u_1}, ..., e_{u_N}, e_{i_1},..., e_{i_M}] E=[eu1,...,euN,ei1,...,eiM]
Message Construction:
m u ← i = f ( e i , e u , p u i ) \large m_{u \leftarrow i} = f(e_i,e_u,p_{ui}) mu←i=f(ei,eu,pui)
m u ← i = 1 ∣ N u ∣ ∣ N i ∣ ( W 1 e i + W 2 ( e i ⊙ e u ) ) \large m_{u \leftarrow i} = \frac{1}{\sqrt{|N_u||N_i|}} (W_1e_i + W_2(e_i \odot e_u)) mu←i=∣Nu∣∣Ni∣1(W1ei+W2(ei⊙eu))
p u i p_{ui} pui是在边 ( u , i ) (u,i) (u,i)上做传播时的衰减因子,反映了historical item对用户偏好的贡献
使用传统GCN的方法实现 f ( ⋅ ) f(\cdot) f(⋅)函数, N u N_u Nu代表user u的一跳邻居
Message Aggregation:
e u ( 1 ) = L e a k y R e L U ( m u ← u + ∑ i ∈ N u m u ← i ) \large e_u^{(1)} = LeakyReLU(m_{u \leftarrow u} + \sum\limits_{i \in N_u}m_{u \leftarrow i}) eu(1)=LeakyReLU(mu←u+i∈Nu∑mu←i)
不仅考虑了u的邻居,还考虑到了u的self-connection m u ← u m_{u \leftarrow u} mu←u
High-order Propagation:
$\Large \begin{equation} e_u^{(k+1)} = \sigma\bigg( W_1e_u^{(k)} + \sum\limits_{i \in N_u} \frac{1}{\sqrt{|N_u||N_i|}} \big (W_1e_i^{(k)} + W_2(e_i^{(k)} \odot e_u^{k}) \big) \bigg) \end{equation} $
e i ( k + 1 ) = σ ( W 1 e i ( k ) + ∑ u ∈ N i 1 ∣ N u ∣ ∣ N i ∣ ( W 1 e u ( k ) + W 2 ( e u ( k ) ⊙ e i k ) ) ) \Large e_i^{(k+1)} = \sigma\bigg( W_1e_i^{(k)} + \sum\limits_{u \in N_i} \frac{1}{\sqrt{|N_u||N_i|}} \big( W_1e_u^{(k)} + W_2(e_u^{(k)} \odot e_i^{k}) \big) \bigg) ei(k+1)=σ(W1ei(k)+u∈Ni∑∣Nu∣∣Ni∣1(W1eu(k)+W2(eu(k)⊙eik)))
⊙ \odot ⊙表示按元素乘积,这使得传递的消息取决于e_i和e_j之间的亲和力,即来自相似的item会传递更多的消息。
将每层得到的user u的表示拼接起来,得到 u u u的最终表示:
e u ∗ = e u ( 0 ) ∣ ∣ . . . ∣ ∣ e u ( L ) \Large e_u^* = e_u^{(0)} ||...|| e_u^{(L)} eu∗=eu(0)∣∣...∣∣eu(L)
同理可得到 i i i的最终表示:
e i ∗ = e i ( 0 ) ∣ ∣ . . . ∣ ∣ e i ( L ) \Large e_i^* = e_i^{(0)} ||...|| e_i^{(L)} ei∗=ei(0)∣∣...∣∣ei(L)
最后使用内积来计算user u对item i的偏好:
y ^ N G C F ( u , i ) = e u ∗ T e i ∗ \Large \hat{y}_{NGCF}(u,i) = e_u^{*T} e_i^* y^NGCF(u,i)=eu∗Tei∗
L o s s = ∑ ( u , i , j ) ∈ O − l n σ ( y ^ u i − y ^ u j ) + λ ∣ ∣ θ ∣ ∣ 2 2 \Large Loss = \sum\limits_{(u,i,j) \in O} -ln \sigma(\hat{y}_{ui} - \hat{y}_{uj}) + \lambda || \theta ||_2^2 Loss=(u,i,j)∈O∑−lnσ(y^ui−y^uj)+λ∣∣θ∣∣22
O = { ( u , i , j ) ∣ ( u , i ) ∈ R + , ( u , j ) ∈ R − } \large O = \{ (u,i,j) | (u,i) \in \mathbb{R}^+, (u,j) \in \mathbb{R}^- \} O={(u,i,j)∣(u,i)∈R+,(u,j)∈R−}表示成对的训练数据
R + \mathbb{R}^+ R+表示observed interactions, R − \mathbb{R}^- R−表示unobserved interactions
GCN起初是为节点分类任务提出的,这上面的每个节点都拥有丰富的属性作为输入。然而在user-item interaction graph中,每个节点仅仅由一个one-hot ID描述,并没有具体的语义信息。由于ID embedding的信息量较少,所以使用多层的非线性特征变换是没有意义的,反而会增加模型训练的难度。
作者通过实验证明了:feature transformation W 1 W_1 W1 W 2 W_2 W2、nonlinear activation σ ( ⋅ ) σ(·) σ(⋅) 对NGCF模型没有任何贡献。
因此作者将上述两个组件去除,仅仅保留了GCN的核心组件 neighborhood aggregation,提出了LightGCN模型。
e u ( k + 1 ) = ∑ i ∈ N u 1 ∣ N u ∣ ∣ N i ∣ e i ( k ) \Large e_u^{(k+1)} = \sum\limits_{i \in N_u} \frac{1}{\sqrt{|N_u||N_i|}} e_i^{(k)} eu(k+1)=i∈Nu∑∣Nu∣∣Ni∣1ei(k)
e i ( k + 1 ) = ∑ u ∈ N i 1 ∣ N i ∣ ∣ N u ∣ e u ( k ) \Large e_i^{(k+1)} = \sum\limits_{u \in N_i} \frac{1}{\sqrt{|N_i||N_u|}} e_u^{(k)} ei(k+1)=u∈Ni∑∣Ni∣∣Nu∣1eu(k)
LightGCN仅仅聚合邻居节点,不去做self-connection聚合。因为后面的Layer Combination中,已经将 e u ( 0 ) e_u^{(0)} eu(0)整合进最终的表示了,所以在每一层的embedding propagation中,没有必要再考虑了。
分别将每一层得到的表示进行weighted sum,得到最终的表示 e u e_u eu e i e_i ei
e u = ∑ k = 0 K α k e u ( k ) \Large e_u = \sum\limits_{k=0}^K \alpha_k e_u^{(k)} eu=k=0∑Kαkeu(k)
e i = ∑ k = 0 K α k e i ( k ) \Large e_i = \sum\limits_{k=0}^K \alpha_k e_i^{(k)} ei=k=0∑Kαkei(k)
与NGCF一样使用内积计算:
y ^ u i = e u T e i \Large \hat{y}_{ui} = e_u^T e_i y^ui=euTei